{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "a9322399",
   "metadata": {},
   "source": [
    "# 11 - 倾向得分\n",
    "\n",
    "## 成长背后的心理学\n",
    "\n",
    "积极心理学领域研究人类行为如何带来美好生活。您可以将其视为自助式书籍与统计的学术严谨性之间的交集。积极心理学的著名发现之一是**成长心态**。其核心思想是人们可以拥有固化或是成长两种心态。如果你有固化的心态，那么你相信能力是在出生时或幼儿时期就被赋予的。因此，智力是固定的，终生无法改变。如果你现在没有它，你就无法获得它。这种想法的推论是你不应该在你不擅长的领域浪费时间，因为你永远不会学会如何处理它们。另一方面，如果你有成长的心态，你相信智力是可以发展的。这样做的直接后果是你认为失败不是最终没有坚持下来的结果，而是学习过程的一部分。\n",
    "\n",
    "我不想争论这些心态中哪一个是正确的（尽管它可能在中间的某个地方）。就我们的目的而言，这并不重要。重要的是，心理学家发现，拥有成长心态的人往往会在生活中做得更好。他们更有可能实现他们的目标。\n",
    "\n",
    "我们精通因果推理，因此我们已经学会以怀疑的态度看待这些陈述。是成长型思维模式让人们取得更多成就吗？或者仅仅是因为成功而获得更多成就的人容易形成成长心态？谁先来，先有蛋还是先有鸡？在潜在的结果符号中，我们有理由相信这些陈述存在偏见。 \\\\(Y_0|T=1\\\\) 可能比 \\\\(Y_0|T=0\\\\) 大，这意味着那些拥有成长型思维模式的人即使拥有固定型思维模式也会取得更多成就。\n",
    "\n",
    "为了解决问题，研究人员设计了 [The National Study of Learning Mindset](https://mindsetscholarsnetwork.org/about-the-network/current-initatives/national-mindset-study/#) 这么一个调研项目。这个研究在美国公立高中进行随机抽样，从而试图发现成长心态的影响。其工作方式是这样的。学生通过在学校参与一个研讨会，得到成长心态这个概念的灌输。然后，研究者跟踪学生在大学期间的表现，以衡量他们在学业上的表现。衡量的结果被编译成标准化的成就分数。为了保护学生的隐私，本研究的真实数据不公开。但是，我们有一个与 [Athey 和 Wager](https://arxiv.org/pdf/1902.07409.pdf) 提供的统计属性相同的模拟数据集，因此我们将改为使用这个数据来进行分析。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "id": "fa276080",
   "metadata": {},
   "outputs": [],
   "source": [
    "import warnings\n",
    "warnings.filterwarnings('ignore')\n",
    "\n",
    "import pandas as pd\n",
    "import numpy as np\n",
    "from matplotlib import style\n",
    "from matplotlib import pyplot as plt\n",
    "import seaborn as sns\n",
    "import statsmodels.formula.api as smf\n",
    "from causalinference import CausalModel\n",
    "\n",
    "import graphviz as gr\n",
    "\n",
    "%matplotlib inline\n",
    "\n",
    "style.use(\"fivethirtyeight\")\n",
    "pd.set_option(\"display.max_columns\", 6)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "9eef0551",
   "metadata": {},
   "source": [
    "除了干预变量和结果变量外，该研究还记录了其他一些特征：\n",
    "\n",
    "* schoolid：学生所在学校的标识符；\n",
    "* success_expect：自我报告的对未来成功的期望，代表先验成就，在随机分配之前测量；\n",
    "* 种族：学生种族/民族的分类变量；\n",
    "* 性别：学生性别的分类变量；\n",
    "* frst_in_family：学生第一代身份的分类变量，即是否家庭中第一个上大学的人；\n",
    "* school_urbanicity：学校级别在城市化程度上的分类变量，即农村、郊区等；\n",
    "* school_mindset：学生固定心态的学校水平平均值，在随机分配之前报告，标准化；\n",
    "* school_achievement：学校成绩水平，由前 4 批学生的考试成绩和大学准备来衡量，标准化；\n",
    "* school_ethnic_minority：学校种族/少数民族组成，即标准化的黑人、拉丁裔或美洲原住民学生人数的百分比；\n",
    "* school_poverty：学校贫困集中度，即来自家庭收入低于联邦贫困线的学生的百分比，标准化；\n",
    "* school_size：学校所有四个年级的学生总数，标准化。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "id": "dd407f6a",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>schoolid</th>\n",
       "      <th>intervention</th>\n",
       "      <th>achievement_score</th>\n",
       "      <th>...</th>\n",
       "      <th>school_ethnic_minority</th>\n",
       "      <th>school_poverty</th>\n",
       "      <th>school_size</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>259</th>\n",
       "      <td>73</td>\n",
       "      <td>1</td>\n",
       "      <td>1.480828</td>\n",
       "      <td>...</td>\n",
       "      <td>-0.515202</td>\n",
       "      <td>-0.169849</td>\n",
       "      <td>0.173954</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3435</th>\n",
       "      <td>76</td>\n",
       "      <td>0</td>\n",
       "      <td>-0.987277</td>\n",
       "      <td>...</td>\n",
       "      <td>-1.310927</td>\n",
       "      <td>0.224077</td>\n",
       "      <td>-0.426757</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>9963</th>\n",
       "      <td>4</td>\n",
       "      <td>0</td>\n",
       "      <td>-0.152340</td>\n",
       "      <td>...</td>\n",
       "      <td>0.875012</td>\n",
       "      <td>-0.724801</td>\n",
       "      <td>0.761781</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4488</th>\n",
       "      <td>67</td>\n",
       "      <td>0</td>\n",
       "      <td>0.358336</td>\n",
       "      <td>...</td>\n",
       "      <td>0.315755</td>\n",
       "      <td>0.054586</td>\n",
       "      <td>1.862187</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2637</th>\n",
       "      <td>16</td>\n",
       "      <td>1</td>\n",
       "      <td>1.360920</td>\n",
       "      <td>...</td>\n",
       "      <td>-0.033161</td>\n",
       "      <td>-0.982274</td>\n",
       "      <td>1.591641</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>5 rows × 13 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "      schoolid  intervention  achievement_score  ...  school_ethnic_minority  \\\n",
       "259         73             1           1.480828  ...               -0.515202   \n",
       "3435        76             0          -0.987277  ...               -1.310927   \n",
       "9963         4             0          -0.152340  ...                0.875012   \n",
       "4488        67             0           0.358336  ...                0.315755   \n",
       "2637        16             1           1.360920  ...               -0.033161   \n",
       "\n",
       "      school_poverty  school_size  \n",
       "259        -0.169849     0.173954  \n",
       "3435        0.224077    -0.426757  \n",
       "9963       -0.724801     0.761781  \n",
       "4488        0.054586     1.862187  \n",
       "2637       -0.982274     1.591641  \n",
       "\n",
       "[5 rows x 13 columns]"
      ]
     },
     "execution_count": 23,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "data = pd.read_csv(\"./data/learning_mindset.csv\")\n",
    "data.sample(5, random_state=5)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "559a5b17",
   "metadata": {},
   "source": [
    "尽管这项研究是随机的，但这些数据似乎并非没有混淆。 如果我们查看其他特征，我们会注意到它们在干预和控制之间系统地变化。 造成这种情况的一个可能原因是干预变量是通过学生对研讨会的接受来衡量的。 因此，虽然参与的机会是随机的，但参与本身却不是。 我们正在处理一个不合规的案例。 这方面的一个证据是学生的成功期望如何与研讨会的参与度相关联。 自我报告的成功期望较高的学生更有可能参加成长心态研讨会。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "id": "0001b3f1",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "success_expect\n",
       "1    0.271739\n",
       "2    0.265957\n",
       "3    0.294118\n",
       "4    0.271617\n",
       "5    0.311070\n",
       "6    0.354287\n",
       "7    0.362319\n",
       "Name: intervention, dtype: float64"
      ]
     },
     "execution_count": 24,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "data.groupby(\"success_expect\")[\"intervention\"].mean()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "5586433c",
   "metadata": {},
   "source": [
    "不过，让我们看看 \\\\(E[Y|T=1] - E[Y|T=0]\\\\) 的含义有何不同。 这将是一个比较有用的基准。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "id": "526c9925",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<table class=\"simpletable\">\n",
       "<tr>\n",
       "        <td></td>          <th>coef</th>     <th>std err</th>      <th>t</th>      <th>P>|t|</th>  <th>[0.025</th>    <th>0.975]</th>  \n",
       "</tr>\n",
       "<tr>\n",
       "  <th>Intercept</th>    <td>   -0.1538</td> <td>    0.012</td> <td>  -13.201</td> <td> 0.000</td> <td>   -0.177</td> <td>   -0.131</td>\n",
       "</tr>\n",
       "<tr>\n",
       "  <th>intervention</th> <td>    0.4723</td> <td>    0.020</td> <td>   23.133</td> <td> 0.000</td> <td>    0.432</td> <td>    0.512</td>\n",
       "</tr>\n",
       "</table>"
      ],
      "text/plain": [
       "<class 'statsmodels.iolib.table.SimpleTable'>"
      ]
     },
     "execution_count": 25,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "smf.ols(\"achievement_score ~ intervention\", data=data).fit().summary().tables[1]"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "cef92537",
   "metadata": {},
   "source": [
    "简单地比较那些有和没有干预的人，我们可以看到，接受干预的人的成就得分平均比未经干预的人高 0.3185 (0.4723 - 0.1538)。但这是大还是小？我知道解释标准化结果可能具有挑战性，但请耐心等待。我认为值得一试，因为这不会是你最后一次遇到标准化分数。\n",
    "\n",
    "标准化的结果变量意味着它是用标准差来衡量的。因此，经过处理的偏差比未经处理的偏差高 0.3185。这就是这个意思。至于这是小还是大，让我们记住一些关于正态分布的东西。我们知道它 95% 的质量在 2 个标准偏差之间，一条尾巴留下 2.5%，另一条尾巴留下 2.5%。这也意味着，如果某人比平均值高 2 个标准差，那么所有个体中有 97.5%（95% 加上左侧 2.5% 的尾部）低于该人。通过查看正常的 CDF，我们还知道其质量的大约 0.85% 低于 1 个标准偏差，而其质量的 70% 低于 0.5 个标准偏差。由于被干预组的平均标准化分数约为 0.5，这意味着他们在个人成就方面低于 70%。或者，换句话说，他们在取得更多成就的前 30% 中。这是图片中的样子。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "id": "b10b5ab6",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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MJS0RETEYbZv346Pj4/T2lfSEhFxkHHjxtW5KO62bdvo06dPi9txlpSUFH70ox+12vFaQklLRMSgqqurXR1Cq1PSEhFpRTNnziQ+Pp60tDRuvfVWQkNDmTVrFufPn7dtP3DgAJs2bcLHxwcfHx9OnTpFdnY2Pj4+fPjhh8TFxWE2m/n444+xWq2sX7+eIUOGEBAQQHR0NO+8847dMX/729/ywx/+kICAAAYPHszixYuxWCzAlVHgypUrOX78uO14V5/9VV5ezuzZswkLCyMoKIif/vSnHD582K7tt956i0GDBtG7d2/i4+MpLi526s9Pq7yLiGFUfTKmdY7zf/96xu12Svuff/45/v7+/P73v6egoIB///d/JywsjMcff5wVK1bw97//nfDwcBYvXgxAz549+eabb4ArCWjZsmX069ePbt26sWzZMrZv386aNWsICwvj0KFDzJ49Gx8fH+6++24Abr75Zl5++WV69+5NXl4ejz/+OJ07d+app55i4sSJHD9+nD179vDBBx8A0L17d6xWK/Hx8XTv3p133nkHX19f3nzzTX7+859z6NAhAgIC+NOf/sSsWbNYtGgREyZMIDs7m6VLlzrlZ3ZVo0ZaBw4cICEhgVtvvdUuC8OV4emSJUuIjo4mMDCQiIgIpk+fzunTp+3auHjxIklJSfTr14/AwEASEhIoKCiwq1NWVsaMGTMICQkhJCSEGTNmaNl+EWl3vLy8WLduHREREcTFxTFhwgT27dsHgLe3N+7u7tx88834+/vj7++PyWSy7btgwQLi4uLo27cvHh4epKam8uKLL3LPPffQt29fJk+ezNSpU9m8ebNtn/nz5zNixAhCQ0MZPXo0jz/+OO+//z4AHh4eeHp60qlTJ9vxPDw8+PTTT/niiy/YunUrQ4cOpV+/fjz11FOEhobaRnIbNmzg7rvvZt68eYSFhZGYmMh9993n1J9do5JWVVUVAwcOZMWKFXh42D/P5vz58xw9epR58+axb98+3nzzTQoKCpg0aRI1NTW2esnJyezcuZMtW7awa9cuKioqiI+Pp7a21lZn+vTpHDt2jPfee4+MjAyOHTvGI4884qCuioi0DREREXTq9K8TXQEBAfzv//5vo/a9/fbbbd/n5eVhsViYNGkSffr0sX299tprfP3117Z627dvZ8yYMdxyyy306dOHJ598kjNnztzw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2VITJ7pcX64JFyJiRE65plVZWcnly5fx8fEB4NSpUxQVFREXF2er4+HhQXR0NDk5OQAcOXKE6upquzpBQUFERETY6oiISMfmlNmDCxcuZPDgwQwfPhyAoqIiAMxms109s9lMYWEhAMXFxZhMJvz8/K6rU1xc7IwwRaQNaemjTUCPN+kIHJ60nnzySQ4ePMju3bsxmUx229zc3OxeW63W68qu1VCd/Pz677BvCWe160xnS011l58tvL6w5pyTo3GOc6V1x11RVVFnuUu427/8/nXba91oW2M5og1HaI04zlXd+HNruVTHZ/0Gtpytq9TEp6UnG91GjF/bvuZutL9l4eHhN9zu0KSVnJxMZmYmO3fupG/fvrZyf39/4MpoKigoyFZeUlJiG3316tWL2tpaSktL6dmzp12d6Ojoeo/ZUAebIz8/3yntOltd167Oni0kMLD3deU9qs60RkgOda70HD38etS5rfqmylaO5gYs9i+9vLzqrFZRUVHvthu65u9ys9pwsGb3pam61v3+X9Wj5/Wf9aaq73emPuEhHi0+prMY9W/ZjTgsaS1YsIDMzEw++OADbrnlFrttoaGh+Pv7k5WVxR133AGAxWLh888/Z+nSpQAMGTIEd3d3srKymDx5MgAFBQXk5eURFRXlqDCljWrUqaGqiraVnESk1Tkkac2bN4933nmHN954Ax8fH9s1LE9PT7p164abmxszZ85k7dq1hIeHExYWxpo1a/D09GTSpEkAeHt7M2XKFBYvXozZbMbX15dFixYRGRnJyJEjHRGmiIgYnEOS1ubNmwFs09mvWrBgAcnJyQDMnj2bCxcukJSURFlZGUOHDiUzM9PulMLy5csxmUwkJiZisViIiYlhw4YN110bE5GO6UarxMONV4rXCvHtg0OSVllZWYN13NzcSE5OtiWxunTt2pXVq1ezevVqR4QlIiLtjNYeFBERw9Aq7yLSbtxoQk9D93iB7vMyAo20RETEMDTSMrBrH+RY53qCNecMeU+WiEhdNNISERHDUNISERHD0OlBaTE96l5EWotGWiIiYhhKWiIiYhg6PdgG1PXE4cbQ04dFGq+hJaDg/5aBqmfGrZaBahs00hIREcPQSEtE5P8UfftNvY/AqW9Fjf9x62z7fkDw7U6LTa7QSEtERAxDIy0RkRb48//+69ry19bmXZ8e24afftzWaKQl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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.hist(data[\"achievement_score\"], bins=20, alpha=0.3, label=\"All\")\n",
    "plt.hist(data.query(\"intervention==0\")[\"achievement_score\"], bins=20, alpha=0.3, color=\"C2\")\n",
    "plt.hist(data.query(\"intervention==1\")[\"achievement_score\"], bins=20, alpha=0.3, color=\"C3\")\n",
    "plt.vlines(-0.1538, 0, 300, label=\"Untreated\", color=\"C2\")\n",
    "plt.vlines(-0.1538+0.4723, 0, 300, label=\"Treated\", color=\"C3\")\n",
    "plt.legend();"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "a5aff397",
   "metadata": {},
   "source": [
    "当然，我们仍然认为这个结果是有偏见的。干预和未干预之间的差异可能比这更小，因为我们认为偏差是积极的。我们已经看到，雄心勃勃的人更愿意参加研讨会，所以即使他们没有参加，他们可能也会取得更大的成就。为了控制这种偏差，我们可以使用回归或匹配，但现在是学习新技术的时候了。\n",
    "\n",
    "## 倾向得分\n",
    "\n",
    "倾向得分来自于意识到您不需要直接控制混杂因素 X 来实现条件独立 \\\\((Y_1, Y_0) \\perp T | X\\\\)。相反，控制平衡分数 \\\\(E[T|X]\\\\) 就足够了。这个平衡分数通常是干预的条件概率，\\\\(P(T|X)\\\\)，也称为倾向评分\\\\(P(x)\\\\)。倾向得分使您不必以整个 X 为条件来实现干预潜在结果的独立性。以这个单一变量为条件就足够了，即倾向得分：\n",
    "\n",
    "$\n",
    "(Y_1, Y_0) \\perp T | P(x)\n",
    "$\n",
    "\n",
    "有一个正式的证据来说明为什么会这样，但我们现在可以忘记它并以更直观的方式处理这个问题。倾向得分是接受干预的条件概率，对吗？因此，我们可以将其视为某种将 X 转换为干预 T 的函数。倾向得分在变量 X 和干预变量 T 之间形成了中间地带。如果我们在因果图中显示它，这就是它的样子喜欢。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "id": "ba8b0578",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/svg+xml": [
       "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\r\n",
       "<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\"\r\n",
       " \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\r\n",
       "<!-- Generated by graphviz version 2.38.0 (20140413.2041)\r\n",
       " -->\r\n",
       "<!-- Title: %3 Pages: 1 -->\r\n",
       "<svg width=\"90pt\" height=\"260pt\"\r\n",
       " viewBox=\"0.00 0.00 90.00 260.00\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\r\n",
       "<g id=\"graph0\" class=\"graph\" transform=\"scale(1 1) rotate(0) translate(4 256)\">\r\n",
       "<title>%3</title>\r\n",
       "<polygon fill=\"white\" stroke=\"none\" points=\"-4,4 -4,-256 86,-256 86,4 -4,4\"/>\r\n",
       "<!-- T -->\r\n",
       "<g id=\"node1\" class=\"node\"><title>T</title>\r\n",
       "<ellipse fill=\"none\" stroke=\"black\" cx=\"55\" cy=\"-90\" rx=\"27\" ry=\"18\"/>\r\n",
       "<text text-anchor=\"middle\" x=\"55\" y=\"-86.3\" font-family=\"Times New Roman,serif\" font-size=\"14.00\">T</text>\r\n",
       "</g>\r\n",
       "<!-- Y -->\r\n",
       "<g id=\"node2\" class=\"node\"><title>Y</title>\r\n",
       "<ellipse fill=\"none\" stroke=\"black\" cx=\"27\" cy=\"-18\" rx=\"27\" ry=\"18\"/>\r\n",
       "<text text-anchor=\"middle\" x=\"27\" y=\"-14.3\" font-family=\"Times New Roman,serif\" font-size=\"14.00\">Y</text>\r\n",
       "</g>\r\n",
       "<!-- T&#45;&gt;Y -->\r\n",
       "<g id=\"edge1\" class=\"edge\"><title>T&#45;&gt;Y</title>\r\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M48.3644,-72.411C45.0866,-64.2164 41.0558,-54.1395 37.3819,-44.9548\"/>\r\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"40.5516,-43.4548 33.588,-35.4699 34.0523,-46.0546 40.5516,-43.4548\"/>\r\n",
       "</g>\r\n",
       "<!-- X -->\r\n",
       "<g id=\"node3\" class=\"node\"><title>X</title>\r\n",
       "<ellipse fill=\"none\" stroke=\"black\" cx=\"27\" cy=\"-234\" rx=\"27\" ry=\"18\"/>\r\n",
       "<text text-anchor=\"middle\" x=\"27\" y=\"-230.3\" font-family=\"Times New Roman,serif\" font-size=\"14.00\">X</text>\r\n",
       "</g>\r\n",
       "<!-- X&#45;&gt;Y -->\r\n",
       "<g id=\"edge2\" class=\"edge\"><title>X&#45;&gt;Y</title>\r\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M23.7517,-215.888C21.9542,-205.542 19.9053,-192.063 19,-180 15.4079,-132.135 15.4079,-119.865 19,-72 19.6366,-63.5179 20.8384,-54.3361 22.1208,-46.0356\"/>\r\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"25.5836,-46.5472 23.7517,-36.1119 18.6763,-45.412 25.5836,-46.5472\"/>\r\n",
       "</g>\r\n",
       "<!-- P(x) -->\r\n",
       "<g id=\"node4\" class=\"node\"><title>P(x)</title>\r\n",
       "<ellipse fill=\"none\" stroke=\"black\" cx=\"55\" cy=\"-162\" rx=\"27\" ry=\"18\"/>\r\n",
       "<text text-anchor=\"middle\" x=\"55\" y=\"-158.3\" font-family=\"Times New Roman,serif\" font-size=\"14.00\">P(x)</text>\r\n",
       "</g>\r\n",
       "<!-- X&#45;&gt;P(x) -->\r\n",
       "<g id=\"edge3\" class=\"edge\"><title>X&#45;&gt;P(x)</title>\r\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M33.6356,-216.411C36.9134,-208.216 40.9442,-198.14 44.6181,-188.955\"/>\r\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"47.9477,-190.055 48.412,-179.47 41.4484,-187.455 47.9477,-190.055\"/>\r\n",
       "</g>\r\n",
       "<!-- P(x)&#45;&gt;T -->\r\n",
       "<g id=\"edge4\" class=\"edge\"><title>P(x)&#45;&gt;T</title>\r\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M55,-143.697C55,-135.983 55,-126.712 55,-118.112\"/>\r\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"58.5001,-118.104 55,-108.104 51.5001,-118.104 58.5001,-118.104\"/>\r\n",
       "</g>\r\n",
       "</g>\r\n",
       "</svg>\r\n"
      ],
      "text/plain": [
       "<graphviz.dot.Digraph at 0x213b3654dc8>"
      ]
     },
     "execution_count": 27,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "g = gr.Digraph()\n",
    "g.edge(\"T\", \"Y\")\n",
    "g.edge(\"X\", \"Y\")\n",
    "g.edge(\"X\", \"P(x)\")\n",
    "g.edge(\"P(x)\", \"T\")\n",
    "g"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "cb775694",
   "metadata": {},
   "source": [
    "如果我知道 P(x) 是什么，那么仅 X 就不会告诉我更多可以帮助我了解 T 是什么的信息。这意味着控制 P(x) 与直接控制 X 的方式相同。根据我们的心态计划来考虑它。干预和未干预最初是不可比较的，因为雄心勃勃的人更有可能接受干预并在生活中取得更多成就。但是，如果我选取 2 个个体，一个来自干预组，一个来自对照组，但接受干预的概率相同，它们是可比较的。想想看。如果他们接受干预的概率完全相同，那么他们中的一个接受干预而另一个没有接受干预的唯一原因是纯粹的机会。保持倾向得分不变可以使数据看起来和随机一样好。\n",
    "\n",
    "现在我们有了直觉，让我们看看数学证明。我们想证明 \\\\((Y_1, Y_0) \\perp T | P(x)\\\\) 等价于说\n",
    "\n",
    "$\n",
    "E[T|P(x), X] = E[T|P(x)]\n",
    "$\n",
    "\n",
    "这只是说，一旦我以 P(x) 为条件，X 就不能给我关于 T 的额外信息。这个证明很奇怪。我们将通过将上面的等式转换为一个简单的陈述来证明上面的等式是正确的。首先看一下左边的\\\\(E[T|P(x), X]\\\\)。\n",
    "\n",
    "$\n",
    "E[T|P(x), X] = E[T|X] = P(x)\n",
    "$\n",
    "\n",
    "我们使用了 P(x) 只是 X 的函数这一事实，因此在我们以 X 本身为条件之后，以它为条件不会提供进一步的信息。然后，我们使用倾向得分 \\\\(E[T|X]\\\\) 的定义。\n",
    "\n",
    "对于右手边，我们将使用迭代期望定律 \\\\(E[A] = E[E[A|B]]\\\\) 这个定律说我们可以通过查看A的值被B分解然后取平均值。\n",
    "\n",
    "$\n",
    "E[T|P(x)] = E[E[T|P(x),X]|P(x)] = E[P(x)|P(x)] = P(x)\n",
    "$\n",
    "\n",
    "第一个相等来自迭代期望定律。第二个来自我们在处理左侧时发现的内容。由于左边和右边都等于 \\\\(P(x)\\\\)，所以这个等式很简单。\n",
    "\n",
    "## 倾向加权\n",
    "\n",
    "![img](./data/img/ps/balance.png)\n",
    "\n",
    "好的，我们得到了倾向得分。怎么办？就像我说过的，我们需要做的就是以此为条件。例如，我们可以运行一个线性回归，它仅以倾向得分为条件，而不是所有的 X。现在，让我们看一下只使用倾向得分而不使用其他任何东西的技术。这个想法是用倾向得分写出均值的条件差\n",
    "\n",
    "$\n",
    "E[Y|X,T=1]−E[Y|X,T=0] = E\\bigg[\\dfrac{Y}{P(x)}|X,T=1\\bigg]P(x) - E\\bigg[\\dfrac{Y}{(1-P(x))}|X,T=0\\bigg](1-P(x))\n",
    "$\n",
    "\n",
    "我们可以进一步简化这一点，但让我们这样看一下，因为它让我们对倾向得分的作用有了一些很好的直觉。第一项是估计 \\\\(Y_1\\\\)。它应用于所有接受干预的对象，并按接受干预的逆概率对它们的权重进行缩放。这样做的目的是使那些接受干预的可能性非常低的人权重增加。想想看，这是有道理的，对吧？如果某人接受干预的可能性很低，那么该人看起来就像未经干预的人。然而，同一个人受到了干预。这一定很有趣。我们有一个看起来像未经干预的被干预对象，因此我们将给予该实体较高的权重。这样做的目的是创建一个与原始全样本相同大小的群体，但每个人都受到干预。出于同样的原因，另一个术语着眼于未经干预的人，并赋予那些看起来像经过干预的人很高的权重。这个估计器被称为**干预加权的逆概率（IPTW）**，因为它通过接受除它所接受的干预之外的某种其他影响的概率来缩放每个单元的权重。\n",
    "\n",
    "在下面在图片中，就展示了这种加权的作用。\n",
    "\n",
    "![img](./data/img/ps/iptw.png)\n",
    "\n",
    "左上图显示了原始数据。蓝点是未干预的，红点是干预过的。底部图显示了倾向得分 \\\\(P(x)\\\\)。注意它是如何在 0 和 1 之间的，并且随着 X 的增加而增长。最后，右上图是加权后的数据。注意更靠左的红色（处理过的）（倾向得分较低）的权重更高。同样，右侧的蓝色图也具有更高的权重。\n",
    "\n",
    "现在我们有了直觉，我们可以将上面的术语简化为\n",
    "\n",
    "$\n",
    "E\\bigg[Y \\dfrac{T-P(x)}{P(x)(1-P(x))}\\bigg|X\\bigg]\n",
    "$\n",
    "\n",
    "如果我们对 X 进行积分，它就会成为我们的倾向得分加权估计量。\n",
    "\n",
    "$\n",
    "E\\bigg[Y \\dfrac{T-P(x)}{P(x)(1-P(x))}\\bigg]\n",
    "$\n",
    "\n",
    "请注意，此估计器要求 \\\\(P(x)\\\\) 和 \\\\(1-P(x)\\\\) 大于零。换句话说，这意味着每个人都需要至少有一些机会接受干预和不接受干预。说明这一点的另一种方式是干预和未干预样本的分布需要重叠。这是因果推理的**正值假设（positivity assumption）**。它也具有直觉意义。如果干预和未干预的样本不重叠，这意味着它们非常不同，我将无法将一组的效果外推到另一组。这种推断并非不可能（回归做到了），但它非常危险。这就像在实验中测试一种新药，只有男性接受治疗，然后假设女性对它的反应同样好。\n",
    "\n",
    "## 倾向得分估计\n",
    "\n",
    "在一个理想的世界中，我们会有真实的倾向得分 \\\\(P(x)\\\\)。 然而，在实践中，分配干预的机制是未知的，我们需要用对它的估计来替换真实的倾向得分 \\\\(\\hat{P}(x)\\\\)。 这样做的一种常见方法是使用逻辑回归，但也可以使用其他机器学习方法，如梯度提升（尽管它需要一些额外的步骤来避免过度拟合）。\n",
    "\n",
    "在这里，我将坚持逻辑回归。 这意味着我必须将数据集中的分类特征转换为假人。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "id": "d6379082",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(10391, 32)\n"
     ]
    }
   ],
   "source": [
    "categ = [\"ethnicity\", \"gender\", \"school_urbanicity\"]\n",
    "cont = [\"school_mindset\", \"school_achievement\", \"school_ethnic_minority\", \"school_poverty\", \"school_size\"]\n",
    "\n",
    "data_with_categ = pd.concat([\n",
    "    data.drop(columns=categ), # dataset without the categorical features\n",
    "    pd.get_dummies(data[categ], columns=categ, drop_first=False)# categorical features converted to dummies\n",
    "], axis=1)\n",
    "\n",
    "print(data_with_categ.shape)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "0f10e058",
   "metadata": {},
   "source": [
    "现在让我们使用逻辑回归（logistic regression）来估计倾向得分。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "id": "a65a6103",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>intervention</th>\n",
       "      <th>achievement_score</th>\n",
       "      <th>propensity_score</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1</td>\n",
       "      <td>0.277359</td>\n",
       "      <td>0.315488</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>1</td>\n",
       "      <td>-0.449646</td>\n",
       "      <td>0.263799</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>1</td>\n",
       "      <td>0.769703</td>\n",
       "      <td>0.344025</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>1</td>\n",
       "      <td>-0.121763</td>\n",
       "      <td>0.344025</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>1</td>\n",
       "      <td>1.526147</td>\n",
       "      <td>0.367788</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   intervention  achievement_score  propensity_score\n",
       "0             1           0.277359          0.315488\n",
       "1             1          -0.449646          0.263799\n",
       "2             1           0.769703          0.344025\n",
       "3             1          -0.121763          0.344025\n",
       "4             1           1.526147          0.367788"
      ]
     },
     "execution_count": 29,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sklearn.linear_model import LogisticRegression\n",
    "\n",
    "T = 'intervention'\n",
    "Y = 'achievement_score'\n",
    "X = data_with_categ.columns.drop(['schoolid', T, Y])\n",
    "\n",
    "ps_model = LogisticRegression(C=1e6).fit(data_with_categ[X], data_with_categ[T])\n",
    "\n",
    "data_ps = data.assign(propensity_score=ps_model.predict_proba(data_with_categ[X])[:, 1])\n",
    "\n",
    "data_ps[[\"intervention\", \"achievement_score\", \"propensity_score\"]].head()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "44d85a0d",
   "metadata": {},
   "source": [
    "首先，我们可以确保倾向得分权重确实重建了每个人都得到干预的人群。 通过产生权重\\\\(1/P(x)\\\\)，它创建了每个人都被对待的群体，并通过提供权重\\\\(1/(1-P(x))\\\\)，它创建了群体，其中 每个人都没有得到干预。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "id": "7c57e36c",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Original Sample Size 10391\n",
      "Treated Population Sample Size 10388.604824722199\n",
      "Untreated Population Sample Size 10391.4305248224\n"
     ]
    }
   ],
   "source": [
    "weight_t = 1/data_ps.query(\"intervention==1\")[\"propensity_score\"]\n",
    "weight_nt = 1/(1-data_ps.query(\"intervention==0\")[\"propensity_score\"])\n",
    "print(\"Original Sample Size\", data.shape[0])\n",
    "print(\"Treated Population Sample Size\", sum(weight_t))\n",
    "print(\"Untreated Population Sample Size\", sum(weight_nt))"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "31798f5b",
   "metadata": {},
   "source": [
    "我们还可以使用倾向得分来找到混淆的证据。 如果人群中的一个细分群体的倾向得分高于另一个群体，这意味着不是随机的东西导致了干预。 如果同样的事情也导致了结果，我们就会感到困惑。 在我们的案例中，我们可以看到自称更有野心的学生也更有可能参加成长心态研讨会。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "id": "3a9a3c34",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "sns.boxplot(x=\"success_expect\", y=\"propensity_score\", data=data_ps)\n",
    "plt.title(\"Confounding Evidence\");"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "95f58d54",
   "metadata": {},
   "source": [
    "我们还必须检查干预和未干预人群之间是否存在重叠。 为此，我们可以看到倾向得分在未干预者和被干预者上的经验分布。 查看下图，我们可以看到没有人的倾向得分为零，即使在倾向得分较低的区域，我们也可以找到接受干预和未接受干预的个体。 这就是我们所说的经过良好平衡的干预和未干预人群。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "id": "f285cf0c",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAaQAAAE0CAYAAABjKkd2AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8/fFQqAAAACXBIWXMAAAsTAAALEwEAmpwYAAA9/0lEQVR4nO3dd1gU1/s28BspioiuIqwiRRGkiWLFYFBRgyaoWCkaC7YEjSUmqMREBctaE1ERLGisSRSxJRYSBXvLzxI1ihg76hJRBAydff/wZb4uvS4D3J/r4rrcM2dnnjku+3DOnDmjlpCQoAAREVElq1XZARAREQFMSEREJBJMSEREJApMSEREJApMSEREJApMSEREJApMSFQtubq6QiKRlOg9O3fuhEQiwc6dO8t0bIlEAldX1zLtQ9VOnz4NiUQCHx+fyg5FkPN/+OjRo8oOhVSECYnKlUQiUfpp1KgRTE1N0bdvX2zZsgVZWVmVFltOwpHJZCo/to+PDyQSCU6fPq2yY546dQqfffYZ2rVrh2bNmkEqlcLOzg5jxozBgQMHkJ2drbJYiIpDo7IDoOpp1qxZAICsrCw8ePAAv/76Ky5cuICoqChs3bq1wo8fEhKClJSUEr2nX79+6NSpE6RSaZmOfenSJWhra5dpH2WRnJyMyZMn48CBA9DS0oKTkxM++eQTaGpqIjY2FidPnsT+/fsxYMAAbNu2rdLiJMqNCYkqhJ+fn9LrW7duoXfv3jhw4ADOnTsHR0fHCj2+sbFxid/ToEEDNGjQoMzHbtWqVZn3UVrZ2dkYO3YsIiIi4OjoiA0bNsDIyEipTmZmJnbv3o2jR49WUpRE+eOQHamEra0tunbtCgD4v//7P6FcLpfD19cXbdu2hYGBAVq0aAF3d3ecOXMmzz4UCgV27NgBFxcXtGzZElKpFDY2Nujfv3+eXlfua0g+Pj6YPHkyAGDp0qVKw4o5w2i5ryGlpqbC1NQUZmZmSE9Pz/e85s+fD4lEotTTyH0Nyc7ODj/99BMAoH///krHBoDRo0dDIpHke84AEBUVBYlEgnHjxuW7/X179+5FREQEmjdvjt27d+dJRgCgoaGB4cOHY+PGjfnu49GjRxg7dizMzMwglUrRvXt3HD58uMBjHjhwAG5ubmjevDkMDAzQvn17zJ8/H4mJifnWf/78Ob755ht06tQJTZo0gYmJCT788EP4+/vj7du3RZ5jdHQ07Ozs0LRpU/z6669F1qeqgz0kqjSPHj3Cxx9/jGfPnqFr164YPHgwXrx4gf379+OPP/7AqlWrMGrUKKH+/PnzERgYCBMTEwwcOBANGjSAXC7HzZs38fPPP2P06NEFHsvV1RVv3rzB4cOH0bVrV3z44YfCNhMTk3zfU6dOHQwePBhbtmzBkSNH4ObmprQ9Ozsbu3fvRt26dTFo0KACj+3j44Ndu3bh5s2b8PLyynO88ePH48CBA9iyZYtSXDk2b94MAPD29i7wGDl+/PFHAMCUKVNQr169QuvWrl07T9mTJ0/Qq1cvtGjRAh4eHnj9+jX27duHESNGYP/+/ejevbtS/a+++gqhoaFo1qwZ+vXrB4lEgj///BOrVq1CREQEjh07Bl1dXaH+tWvXMGTIEMTHx6Nz587o27cvMjIycO/ePaxduxZjxoyBjo5OgTGfPXsWI0aMgLq6Og4ePIhOnToV2SZUdTAhkUrcvn0bZ8+eBQC0b98eAPDll1/i2bNnmD17NmbPni3U/eKLL9C7d2/4+vqiZ8+ewl/5W7duRdOmTXH+/Pk8X1rx8fGFHr9fv35CQvrwww/zDCkWZMSIEdiyZQt27dqVJyFFRUXh2bNncHd3V/rSzW3SpEm4ceMGbt68ieHDh8PJyUlpu5OTE6ytrXHo0CG8fPkSjRs3FrbJ5XIcOXIElpaW+Sar92VmZuLy5csAAGdn52KdX25nzpzBnDlz4OvrK5QNGzYMQ4YMwZo1a5QS0i+//ILQ0FD069cPGzduVLputnz5cixatAgymQyLFy8GAKSnp2PUqFGIj49HYGBgnj8g4uPjC01G4eHh8PHxQbNmzRAWFgYzM7NSnSOJF4fsqELIZDLIZDIsXLgQEyZMgLOzM1JSUtCvXz907doVsbGxOHHiBAwNDTFjxgyl99ra2mLs2LFIS0vDL7/8IpTXqlULmpqa0NDI+3eUnp5ehZxHx44dYWlpiePHj+Pff/9V2rZr1y4A75JWWY0bNw7p6enYsWOHUvn27duRkZFRrN7R69evhaFFQ0PDUsVhYmKS5/+jV69eMDY2xpUrV5TK161bB3V1daxZsybPJI4ZM2ZAT08Pu3fvFsqOHDmCx48fo1evXvn2ZvX09FCnTp1841qzZg3GjRsHOzs7REREMBlVU+whUYVYunQpAEBNTQ26urpo27Ythg0bhjFjxgAA/vrrLwBAly5doKWllef9PXr0QFBQEK5fvy6Uubu7IyQkBJ07d8bAgQPxwQcfwMHBAQ0bNqzQc/Hy8sL8+fPxyy+/4IsvvgAAJCYm4rfffoORkVGeHk9peHh4wN/fHz/++COmTZsGNTU1ZGdnY9u2bahbty48PT2L3IdCUfYnydjZ2UFdXT1PebNmzXDp0iXhdUpKCv766y80bNgQISEh+e5LS0sLz58/x6tXr9CoUSP8+eefAAAXF5cSxTRnzhz8+uuv+OSTTxAaGlqpMxipYjEhUYVISEgodHvOBW8DA4N8t+dMvX7/wviiRYtgZmaGHTt2YPXq1QgMDEStWrXQvXt3BAQEwM7OrnyCz8XT0xMLFizArl27hIS0f/9+pKSkwNPTE7VqlX2gQVdXF56enti4cSNOnDiBXr164Y8//sDjx4/x6aefFusm30aNGkFLSwvp6el49uxZqXoR9evXz7dcXV1d6b6l169fQ6FQ4NWrV8IfHwVJTk5Go0aN8ObNGwAl773lDPX27duXyaia45AdVYqcL764uLh8t8vlcqV6wLsvxYkTJ+LUqVP4559/sHPnTri7uyMqKgqDBg3Cq1evKiTWJk2aoGfPnvj7779x7do1AP8brhs+fHi5HSdnFl3OJIYtW7YAAMaOHVus92toaAgX+U+ePFluceUn5//FxsYGCQkJhf7kTOLImVL//PnzEh1r165dMDc3x7Rp07Bp06byPRESFSYkqhRt2rQBAFy8eDHfKdU5X6j29vb5vr9Ro0ZwdXVFSEgIhgwZgpcvX+LChQuFHjNnKKo0q0XkJJ6ffvoJDx48wIULF/DBBx8UuxeSc+zCVkewsrKCk5MTjh49ij///BMRERGwt7cXJoEUR86Q6Jo1a4qcQp2Wllbs/eZWr1492NjYICYmpsgJJTlykmVERESJjmVoaIjDhw/D2toaX3/9NdasWVPieKlqYEKiStGsWTP06tULsbGxCAwMVNp2+/ZtbN68GbVr14a7uzuAd1+eUVFReb7QFQqFMNmgoAviOXImPjx9+rTE8X7yySdo2LAhwsLChHuevLy8iv3+nGM/efKk0Hrjx49HVlYWPv30U2RlZRW7d5RjyJAhcHFxwf379+Hp6Ylnz57lqZOVlYXdu3dj4sSJJdp3bpMnT0ZGRgYmTZqE169f59melJQkXDcCgI8//himpqb4448/sH379jz1X716hdTU1HyPZWBggF9//RVt27bFd999V+QwIVVNvIZEleb7779H3759sWjRIpw6dQqdOnUS7kNKSUlBYGCgMOU7JSUFAwcOhJGRETp16gRjY2NkZGTgzJkzuHHjBjp27Ihu3boVerzOnTujXr16CA8Ph5aWFoyMjKCmpgYPD48C70XKUbt2bQwZMgSbNm1CUFBQkfce5dazZ08EBgYiICAAt2/fFq4JvT+9Gnh3v5ShoSGePXuG+vXrY8iQIcU+BvBuJuLmzZsxadIkHDx4EO3atUO3bt1gaWkpLB10+vRpPH/+HAMHDizRvnMbMWIErl+/jg0bNsDe3h69evWCiYkJ3rx5g8ePH+PcuXNwdnYWhjc1NTWxdetWDB48GFOmTMHOnTvRuXNnZGZm4p9//kFUVBQuXboEU1PTfI/XqFEjHDx4EO7u7pDJZEhNTcW8efPKdA4kLkxIVGlMTU0RFRWFFStW4OjRo7hw4QJ0dHTQtWtXTJ06VWn2mo6ODgICAnD69GlcvnwZR44cgba2NkxNTbFw4UJ4e3vnOx38fQ0aNMDOnTshk8kQHh6O5ORkAO9m+hWVkIB3X8CbNm1CRkYGBg0aVOi9R7l1794dy5Ytw5YtW7Bp0yZhuCx3QtLQ0ICHhwd++OEHeHh4FHpfTkHq1auHbdu24eTJk9i5cycuXbqEs2fPIjMzEwYGBujYsSOGDh2K/v37l3jfuS1btgwuLi4IDQ3FmTNn8Pr1azRo0ACGhoYYN24chg0bplTf3t4ep0+fRmBgICIiIhASEgJtbW2YmJjgiy++gL6+fqHHa9CgAcLDw+Hl5YUffvgB//33H5YsWQI1NbUynwtVPrWEhISyzxUlonIzaNAgREZG4vz587C2tq7scIhUhteQiETk2rVriIyMFFZvIKpJOGRHJAIbNmzA8+fP8fPPP0NNTQ3ffvttZYdEpHIcsiMSATs7O8TGxqJFixaYOXMmPDw8KjskIpVjQiIiIlHgNSQiIhIFJiQiIhIFJiQiIhIFJqQqLiYmprJDqHbYphWD7Vr+qlubMiEREZEoMCEREZEoMCEREZEoMCEREZEocOkgIiq1zMzMIh8EmKNOnTrCY8ypfIixTXV0dIpceb8gTEhEVCqZmZlISkqCRCIp1uMfateuXeRDFKlkxNamCoUCCQkJ0NXVLVVS4pAdEZXK27dvi52MqGZQU1ODRCIpdq85NyYkIio1JiPKrSyfCQ7ZEZWjH6Pz/8twjGXJn/xKVNOwh0RERKLAhERERCXywQcfQCaTlft+OWRHROWqoGHLjIwMaGpmlfvxSjoc6uPjg59++glz5syBr6+vUH769Gn0798f//zzD/T09Mo7TKVjFyYhIaFCji2RSLB161a4ublVyP7LA3tIRFTj1KlTB6tXr8bLly9VetwlS5YgOjpa+Klbty5kMplS2fvS09NVGl9lY0IiohrHyckJxsbGWLZsWaH1zp49i169ekEqlcLCwgJ+fn5KScLV1RVfffUVAgICYGZmBnNzc3z77bfIzs7Od38NGjSAVCoVftTU1FC/fn3h9dixYzFjxgx8++23aNmyJfr06QMAuHPnDtzd3WFkZARzc3OMGzcOcrlc2O+VK1cwaNAgmJmZwdjYGH379sWlS5eE7XZ2dgCA0aNHQyKRCK8B4MiRI+jevTukUinatGmDBQsWKJ3jv//+Cy8vLzRp0gStW7fG9u3bS9DSJcOEREQ1Tq1atTB//nxs2bIFDx48yLfOs2fPMGzYMLRp0wanTp3CmjVrsHfvXvj7+yvV27NnD9TV1REREYHly5cjODgY4eHhpY5t9+7dUCgUOHLkCEJCQvDixQt88sknsLa2xvHjx7F//34kJyfDy8tLSHxJSUnw8PDAkSNHcPz4cdjZ2WHYsGGIj48HAERGRgIAVq9ejejoaOH18ePHMXHiREyYMAEXLlzA2rVrceDAAQQEBAjxTJo0CQ8ePMD+/fuxc+dO/Pzzz3j8+HGpz68wTEhEVCO5uLjAwcEBCxYsyHd7aGgopFIpVq5cCUtLS/Tt2xfz5s3Dxo0b8d9//wn1LC0tMWfOHJibm2PQoEFwcnLCyZMnSx2XiYkJFi1ahFatWsHS0hKhoaFo3bo1/P39YWlpidatW2P9+vW4cuUKrl27BgDo3r07PD09YWlpiVatWmHZsmWoU6cO/vjjDwBA48aNAfyvh5bzesWKFZgyZQo+/fRTtGjRAt26dRMStUKhwL179/D7779j1apV6NKlC9q2bYvg4GCkpKSU+vwKw0kNRPko6MI8wHuKqpOAgAD07t0bU6ZMybMtOjoanTp1Qq1a//u7/YMPPkB6ejru37+P1q1bAwBsbW2V3tekSRP8+++/pY7J3t5e6fX169dx7tw5NGvWLE/dR48ewdHREf/++y8WLVqE06dP499//0VWVhZSUlLw9OnTQo91/fp1XLlyBYGBgUJZdnY2UlJSIJfLER0djVq1aqFDhw7CdhMTEzRt2rTU51cYJiQiqrHat2+PAQMGYN68eUoz7oB367IVtOrA++Wampp5tikUilLHpKOj/AdPdnY2XFxcsHDhwjx169evD+Dd7L24uDgsXrwYJiYmqF27NgYMGFDkpIjs7GzMmjULAwcOzLOtcePGZTqP0mBCIqIabe7cuXBwcMDx48eVyq2srLBv3z5kZ2cLvaTz589DS0sLLVq0UFl8bdu2xb59+2BsbJwn+aWmpgIALly4gCVLlgiTIOLi4pQmPQDvEmdWlvK0+7Zt2+Lu3bswMzPL99iWlpbIzs7GlStX4ODgAAB48uQJnj9/Xi7nlhuvIRFRjWZmZoYxY8YgJCREqXzcuHF48eIFvvrqK0RHR+PYsWPw9/fHhAkTULduXZXFN378eCQmJsLb2xt//vknHj58iKioKEybNg3JyckAgJYtW2L37t24c+cOrly5grFjx0JLS0tpPyYmJjh58iTkcrlwr9PMmTMRFhaGRYsW4e+//8bdu3dx4MABzJ07FwBgYWGB3r1748svv8SlS5fw119/YdKkSdDW1q6Qc2UPiYjKVUHX2FJTU0X1qIT3zZw5M88Nq4aGhtizZw/mzp0LJycnNGjQAEOHDhW+rFWladOmQjIcMmQI0tLSYGRkBGdnZyHprF27FtOnT0ePHj3QpEkTzJ49W5hhl2PhwoWYM2cObG1t0bRpU9y4cQO9evXC7t27sXz5cqxduxYaGhpo2bIlhg8fLrxv3bp1mDp1KgYMGAA9PT3MmjWrwu7fUktISFDtICGVq5iYGFhYWFR2GNVKTEwMzmYbFri9sEkNNWlx1Tdv3qBBgwbFri/mhFRVibVNS/rZyMEhOyIiEgUmJCIiEgUmJCIiEoUiE5JMJoNEIlH6adWqlbBdoVBAJpPBysoKTZo0gaurK27fvq20j7S0NPj6+sLMzAyGhobw9PREbGxs+Z8NERFVWcXqIVlYWCitRnvu3DlhW2BgIIKCgrB06VKcOHEC+vr6GDRoEJKSkoQ6fn5+OHToEEJDQ3H48GFh3aXcc+KJiKjmKlZC0tDQUFqhNmcdJIVCgeDgYEyfPh1ubm6wsbFBcHAwkpOTERYWBuDdbIvt27cjICAAzs7OsLe3x/r163Hr1i1ERUVV2IkREVHVUqyE9PDhQ1hbW6NNmzYYO3YsHj58CODdOkpyuRw9e/YU6mpra8PR0REXL14EAFy7dg0ZGRlKdYyMjGBpaSnUISIiKvLG2I4dO2LdunWwsLDAy5cvsXz5cri4uODChQvC0hT6+vpK79HX1xeWloiLi4O6unqeJzDq6+sjLi6u0GPHxMSU6GRqKrZT+ZPHyQvcFlOr4KFmeZx6id9TVdWpUwe1a9cu0Xtylrqh8iPGNk1MTMz3+72oeyaLTEgfffSR0uuOHTvC3t4eu3btQqdOnQAgzwKEhS1KWJI6vOGzaLwxtvzFxMRAaiAtcLuFRcE3uUqz878xtrD3VFVv3rwp0U2ZYr2JsyoTa5vWr18fxsbGJX5fiad916tXD1ZWVrh//z6k0ne/tLkz4cuXL4Vek4GBAbKysvIsY/F+HSIiKp6rV69CIpHg0aNHlR1KuSvxWnapqamIiYmBk5MTTE1NIZVKERkZifbt2wvbz58/Lzxx0N7eHpqamoiMjMSwYcMAALGxsYiOjhZWjyWqyarbs5c0Ig/lW147IwMauVarLg+Zzv2LXVcikRS63cvLC8HBwWWMKK+dO3di5syZvN2lCEUmpG+//RZ9+/aFkZGRcA3pv//+g5eXF9TU1ODj44OVK1fCwsIC5ubmWLFiBXR0dDB06FAA755QOHLkSMydOxf6+vpo2LChsMBfjx49Kvr8iIgE0dHRwr+PHTuGqVOnKpXlHv7KyMjI88gHqjhFDtk9e/YM48ePR6dOnTBy5EhoaWnh999/h4mJCQBg2rRpmDRpEnx9feHs7IwXL14gPDwcurq6wj4WL16Mfv36wdvbG3379oWOjg5+/vlnqKvnfwGYiKgivH/7Ss7inzmvU1NTYWpqirCwMPTv3x9NmjTBli1bAAA7duyAg4MDpFIpOnTogKCgIGRnZwv7Xbt2LRwdHWFoaAhra2tMmTJFeMTD6dOnMXnyZLx9+1ZYXEAmkwEA0tPTMW/ePNjY2MDQ0BDOzs55nsv0xx9/oFOnTpBKpfj4449x7949FbRU5Siyh7R58+ZCt6upqcHPzw9+fn4F1qlTpw6WL1+O5cuXlzxCIiIV8vf3x8KFC7FmzRpoampi69atWLx4MZYtW4a2bdvi9u3bmDZtGjQ1NTFx4kQAQK1atSCTydC8eXM8efIEM2fOxMyZM7FhwwY4ODhAJpNhwYIFuHr1KoD/PRV28uTJePDgATZu3IhmzZohIiICnp6eOHHiBOzs7PD06VOMGDECo0aNwoQJE3Dr1i3MmTOn0tqmovF5SERE75k4cSLc3NyE18uXL4e/v79Q1rx5czx48AChoaFCQpo0aZJQ39TUFAEBARg+fDhCQkKgpaWF+vXrQ01NTZgIBgAPHjxAWFgY/vrrL2FG2sSJExEVFYUff/wRK1euxObNm2FkZIRly5ZBTU0NrVq1wr1797Bo0SJVNIXKMSEREb2nXbt2wr9fvnyJp0+f4ssvv8RXX30llGdmZkKh+N+j5E6ePIkffvgBd+/eRWJiIrKyspCeng65XI6mTZvme5zr169DoVCgS5cuSuVpaWno1q0bgHfXvDp27Kh0i0znzp3L5TzFiAmJiOg9OcNpAITrRN9//32Bs4IfP34MDw8PjBo1Ct988w0aNWqE69evY9y4cUhPTy/wONnZ2VBTU8OJEyfyTJzImVzxftKrCZiQiIgKYGBgAENDQzx48ABeXl751rl69SrS09Mhk8mEiVpHjx5VqqOlpZVnMek2bdpAoVBALpcLPaLcrKyscPDgQaWFBC5fvlzW0xItPg+JiKgQs2fPxurVqxEUFISYmBj8/fff+Omnn/D9998DAFq2bIns7GysW7cODx8+RFhYGEJCQpT2YWJigtTUVERGRiI+Ph7//fcfzM3N4e7ujkmTJuHAgQN4+PAhrl69ijVr1uDgwYMAAG9vbzx+/BizZ89GTEwMDhw4IMz8q47YQyKiclXQjappqalQE+EyN0UZNWoU6tati9WrVyMgIAB16tSBtbU1JkyYAABo3bo1lixZgsDAQCxatAidO3fGggUL4O3tLezDwcEBY8eOxbhx4/Dq1SvMmjULfn5+CAoKwooVKzB37lw8e/YMDRs2RPv27eHk5AQAMDY2xvbt2zFnzhz8+OOPsLe3x7x584TJFNWNWkJCQs0apKxmuJZd+YuJicHZbMMCtxe2ekJBqy6U5j1Fva+yvXnzRriXpzjEuu5aVSbWNi3pZyMHe0hUYxWUCORx6pAaqDgYImJCIlKFwnpBRPQOJzUQEZEoMCEREZEoMCEREZEoMCERUanVtJUEqGhl+UwwIRFRqejo6CAhIYFJiQQKhQIJCQlKyy+VBGfZEZUQZ8y9o6GhAV1dXSQmJharfmJiIurXr1/BUdUsYmxTXV1daGiULrUwIRFRqWloaBT7Bsi4uDjhMQtUPqpbm3LIjoiIRIEJiYiIRIFDdkQiVlXXuSMqDfaQiIhIFJiQiIhIFJiQiIhIFJiQiIhIFJiQiIhIFJiQiIhIFJiQiIhIFJiQiIhIFJiQiIhIFJiQiIhIFEqckFauXAmJRAJfX1+hTKFQQCaTwcrKCk2aNIGrqytu376t9L60tDT4+vrCzMwMhoaG8PT0RGxsbNnPgIiIqoUSJaTLly9j69atsLW1VSoPDAxEUFAQli5dihMnTkBfXx+DBg1CUlKSUMfPzw+HDh1CaGgoDh8+jKSkJHh4eCArK6t8zoSIiKq0YiekN2/eYMKECVizZg0kEolQrlAoEBwcjOnTp8PNzQ02NjYIDg5GcnIywsLChPdu374dAQEBcHZ2hr29PdavX49bt24hKiqqvM+JiIiqoGInpJyE0717d6XyR48eQS6Xo2fPnkKZtrY2HB0dcfHiRQDAtWvXkJGRoVTHyMgIlpaWQh0iIqrZivX4ia1bt+L+/ftYv359nm1yuRwAoK+vr1Sur6+P58+fA3j3VEN1dXXo6enlqRMXF1fgcWNiYooTXo3HdiodeZx6IdvkKoykdGJqVb3hbn5Wy19ValMLC4tCtxeZkGJiYhAQEIAjR45AS0urwHpqampKrxUKRZ6y3IqqU1Tw9O7/h+1UOtLs/J81JI+TQ2ogVXE0JWdhUbWeh8TPavmrbm1a5JDdpUuXEB8fjw8++AB6enrQ09PD2bNnsWnTJujp6aFRo0YAkKen8/LlS6HXZGBggKysLMTHxxdYh4iIarYie0iurq5o166dUtnkyZPRsmVLzJgxA+bm5pBKpYiMjET79u0BAKmpqTh//jwCAgIAAPb29tDU1ERkZCSGDRsGAIiNjUV0dDQcHBzK+5yIagQ+TZaqmyITkkQiUZpVBwB169ZFw4YNYWNjAwDw8fHBypUrYWFhAXNzc6xYsQI6OjoYOnQoAKBBgwYYOXIk5s6dC319fTRs2BBz5syBra0tevToUe4nRUREVU+xJjUUZdq0aUhJSYGvry8SEhLQoUMHhIeHQ1dXV6izePFiqKurw9vbG6mpqejWrRtCQkKgrl7whWUiIqo51BISEhSVHQSVXnW7qKlKBQ15VZVJDYUR45AdP6vlr7q1KdeyIyIiUWBCIiIiUWBCIiIiUWBCIiIiUWBCIiIiUWBCIiIiUWBCIiIiUWBCIiIiUSiXlRqIxKqw9d6ISFzYQyIiIlFgQiIiIlFgQiIiIlFgQiIiIlFgQiIiIlFgQiIiIlHgtG+iaoiPN6eqiAmJqjzea0RUPXDIjoiIRIEJiYiIRIEJiYiIRIEJiYiIRIEJiYiIRIEJiYiIRIEJiYiIRIEJiYiIRIEJiYiIRIEJiYiIRIEJiYiIRIEJiYiIRKHIhLRx40Y4OjrC2NgYxsbG+Oijj3Ds2DFhu0KhgEwmg5WVFZo0aQJXV1fcvn1baR9paWnw9fWFmZkZDA0N4enpidjY2PI/GyIiqrKKTEiGhobw9/fHyZMnERkZiW7dumHEiBG4efMmACAwMBBBQUFYunQpTpw4AX19fQwaNAhJSUnCPvz8/HDo0CGEhobi8OHDSEpKgoeHB7KysiruzIiIqEopMiG5urrio48+gpmZGczNzfHdd9+hXr16uHz5MhQKBYKDgzF9+nS4ubnBxsYGwcHBSE5ORlhYGADgzZs32L59OwICAuDs7Ax7e3usX78et27dQlRUVEWfHxERVREluoaUlZWFvXv34u3bt+jcuTMePXoEuVyOnj17CnW0tbXh6OiIixcvAgCuXbuGjIwMpTpGRkawtLQU6hARERXrAX23bt2Ci4sLUlNToaOjgx07dsDW1lZIKPr6+kr19fX18fz5cwBAXFwc1NXVoaenl6dOXFxceZwDERFVA8VKSBYWFjh9+jTevHmDgwcPwsfHB7/++quwXU1NTam+QqHIU5ZbcerExMQUJ7war6a3kzxOvQL2KS/3fYpFTK3Ku3Zb0z+rFaEqtamFhUWh24uVkLS0tGBmZgYAaNeuHa5cuYJ169bh66+/BvCuF2RkZCTUf/nypdBrMjAwQFZWFuLj49G4cWOlOo6OjmUKnt59GGt6O0mzy/cR5vI4OaQG0nLdp5hYWOhUynH5WS1/1a1NS3UfUnZ2NtLT02FqagqpVIrIyEhhW2pqKs6fPw8HBwcAgL29PTQ1NZXqxMbGIjo6WqhDRERUZA9p/vz5cHFxQbNmzYTZc2fOnMHu3buhpqYGHx8frFy5EhYWFjA3N8eKFSugo6ODoUOHAgAaNGiAkSNHYu7cudDX10fDhg0xZ84c2NraokePHhV9fkREVEUUmZDkcjkmTpyIuLg41K9fH7a2tggLC0OvXr0AANOmTUNKSgp8fX2RkJCADh06IDw8HLq6usI+Fi9eDHV1dXh7eyM1NRXdunVDSEgI1NXLf+yfiIiqJrWEhARFZQdBpVfdxpBL48doXkMqiTGWvIZUXVS3NuVadkREJApMSEREJApMSEREJApMSEREJApMSEREJApMSEREJApMSEREJArFWsuOiCqO7dUjBW671e5jFUZCVLnYQyIiIlFgQiIiIlHgkB1VGeW9RBApK6x9K2u5IapZ2EMiIiJRYEIiIiJRYEIiIiJR4DUkohqG1+JIrNhDIiIiUWBCIiIiUWBCIiIiUWBCIiIiUeCkBqICFLTGXGHry3FdOqLSY0IiUpHCkhURMSGRyHBKMlHNxWtIREQkCuwhEZUQh96IKgZ7SEREJApMSEREJApMSEREJAq8hkQkYryviWoS9pCIiEgU2EMioiLx8eakCkX2kL7//ns4OzvD2NgYLVu2hIeHB/7++2+lOgqFAjKZDFZWVmjSpAlcXV1x+/ZtpTppaWnw9fWFmZkZDA0N4enpidjY2PI9GyIiqrKKTEhnzpzBuHHjcOzYMRw8eBAaGhoYOHAgXr9+LdQJDAxEUFAQli5dihMnTkBfXx+DBg1CUlKSUMfPzw+HDh1CaGgoDh8+jKSkJHh4eCArK6tizoyIiKqUIofswsPDlV6vX78eJiYmuHDhAj7++GMoFAoEBwdj+vTpcHNzAwAEBwfDwsICYWFh8Pb2xps3b7B9+3YEBQXB2dlZ2I+dnR2ioqLQq1evCjg1IiKqSko8qSE5ORnZ2dmQSCQAgEePHkEul6Nnz55CHW1tbTg6OuLixYsAgGvXriEjI0OpjpGRESwtLYU6RERUs5V4UsPs2bNhZ2eHzp07AwDkcjkAQF9fX6mevr4+nj9/DgCIi4uDuro69PT08tSJi4sr8FgxMTElDa9Gqk7tJI9Tr+wQAADyODmMkxIrO4xCyePklR0CACCmVvGH3avTZ1UsqlKbWlhYFLq9RAnpm2++wYULF3D06FGoqyt/caipqSm9VigUecpyK6pOUcHTuw9jdWonaXblr/Ytj5NDaiBF/dj6lR1KoaQG0soOAQBgYVG8WXbV7bMqBtWtTYs9ZOfn54e9e/fi4MGDaN68uVAulb77pcjd03n58qXQazIwMEBWVhbi4+MLrENERDVbsRLSrFmzEBYWhoMHD6JVq1ZK20xNTSGVShEZGSmUpaam4vz583BwcAAA2NvbQ1NTU6lObGwsoqOjhTpERFSzFTlk9/XXX+OXX37Bjh07IJFIhGtGOjo6qFevHtTU1ODj44OVK1fCwsIC5ubmWLFiBXR0dDB06FAAQIMGDTBy5EjMnTsX+vr6aNiwIebMmQNbW1v06NGjQk+QqDD5Lc1jnJQo+uG6wnC5IaqqikxImzZtAgBhSneOWbNmwc/PDwAwbdo0pKSkwNfXFwkJCejQoQPCw8Ohq6sr1F+8eDHU1dXh7e2N1NRUdOvWDSEhIXmuRRFR8fC5TFTdqCUkJCgqOwgqvep2UVPVjzDP70s9MSkR9XWrbg+pMBXRQyru0kHV7bMqBtWtTbm4KhERiQITEhERiQITEhERiQITEhERiQITEhERiQITEhERiQITEhERiQITEhERiUKJHz9BVNVwRQOiqoE9JCIiEgX2kIgIQME9SS7ISqrChERUg3D4ksSMQ3ZERCQKTEhERCQKHLKjaoPDUURVG3tIREQkCuwhEVGh+Eh0UhUmJFI5VT8VloiqBg7ZERGRKDAhERGRKDAhERGRKDAhERGRKHBSAxFVmPcnsMjj1CHN/t/rMZY6lRESiRh7SEREJArsIRFRmXAaP5UX9pCIiEgUmJCIiEgUmJCIiEgUmJCIiEgUipWQzp49C09PT1hbW0MikWDnzp1K2xUKBWQyGaysrNCkSRO4urri9u3bSnXS0tLg6+sLMzMzGBoawtPTE7GxseV3JkREVKUVa5bd27dvYWNjAy8vL3z++ed5tgcGBiIoKAhBQUGwsLDAsmXLMGjQIFy+fBm6uroAAD8/Pxw+fBihoaFo2LAh5syZAw8PD5w8eRLq6urle1ZU6TjziohKqlg9JBcXF8ydOxdubm6oVUv5LQqFAsHBwZg+fTrc3NxgY2OD4OBgJCcnIywsDADw5s0bbN++HQEBAXB2doa9vT3Wr1+PW7duISoqqtxPioiIqp4yX0N69OgR5HI5evbsKZRpa2vD0dERFy9eBABcu3YNGRkZSnWMjIxgaWkp1CEiopqtzDfGyuVyAIC+vr5Sub6+Pp4/fw4AiIuLg7q6OvT09PLUiYuLK3DfMTExZQ2vRhBjO8njVD8Ma5yUWG77SizHfVVn8jh5qevH1Moq73BqJDH+/hfEwsKi0O3ltlKDmpqa0muFQpGnLLei6hQVPL37MIqxnd5fs0xV6sfWL5f9JCYlor5u+eyrupMaSItdVx4nV6pvYcG17MpKrL//pVXmITup9N0HLHdP5+XLl0KvycDAAFlZWYiPjy+wDhER1WxlTkimpqaQSqWIjIwUylJTU3H+/Hk4ODgAAOzt7aGpqalUJzY2FtHR0UIdIiKq2Yo1ZJecnIz79+8DALKzs/H06VP89ddfaNiwIYyNjeHj44OVK1fCwsIC5ubmWLFiBXR0dDB06FAAQIMGDTBy5EjMnTsX+vr6wrRvW1tb9OjRo8JOjoiIqo5iJaSrV6+if//+wmuZTAaZTAYvLy8EBwdj2rRpSElJga+vLxISEtChQweEh4cL9yABwOLFi6Gurg5vb2+kpqaiW7duCAkJ4T1IVCK2V49UdghEVEHUEhISFJUdBJWeWC9qVtSNsapISJzUUHy32n1c7Lq5JzXwAX1lJ9bf/9LiWnZERCQKTEhERCQKfGIsEZVaYUOoJRnOIwKYkKgMuIAqlUVhnx9eX6qZOGRHRESiwIRERESiwCE7Eh3ea0RUMzEhEVGFyP2HhXFSIurH1udkByoQh+yIiEgUmJCIiEgUOGRHheLUbiJSFfaQiIhIFNhDIiKV4uoOVBAmJCKqMri6Q/XGhESVhvcbEdH7mJAIACcvEFHl46QGIiISBfaQiEh02GOvmdhDIiIiUWAPicqM03ipvPCzVLMxIVGF4kw6IiouJiQiqhIK+uOGPafqgwmpBuGFYiISM05qICIiUWAPqZphL4iIqiomJFLCSQhU1eR8ZjWe1c6zLdO5v6rDoTLgkB0REYkCe0hV0PvDcvI4dUizOUxHRFUfExIR1Wh8pIV4qDwhbdq0CatXr4ZcLoeVlRVkMhkcHR1VHUaNxutEVB2dl6flKbtVSLLJ+T2wzf0e3tdUaVR6DSk8PByzZ8/GV199hVOnTqFz584YNmwYnjx5osowiIhIhFTaQwoKCsLw4cMxevRoAMDy5ctx/PhxbN68GfPmzVNlKKJXHtO32ROimq4ifwdK8zvKIcDCqSUkJChUcaD09HQ0bdoUoaGhGDhwoFD+9ddf4++//8bhw4dVEQYREYmUyobs4uPjkZWVBX19faVyfX19xMXFqSoMIiISKZXfh6Smpqb0WqFQ5CkjIqKaR2UJSU9PD+rq6nl6Qy9fvszTayIioppHZQlJS0sL9vb2iIyMVCqPjIyEg4ODqsIgIiKRUuksu8mTJ+Ozzz5Dhw4d4ODggM2bN+PFixfw9vZWZRhERCRCKr2GNHjwYMhkMixfvhxOTk64cOECdu/eDRMTE1WGUaVs2rQJbdq0gVQqRffu3XHu3LkC654+fRpeXl6wtLRE06ZN4ejoiO3bt6sw2qqhJG16584d9OvXDxYWFpBKpWjbti0CAgKQnp6uwojFryRt+r5//vkHRkZGaNasWQVHWPWUpE0fPXoEiUSS5+ePP/5QYcRlp/JJDePHj8eNGzcQFxeHkydPomvXrqoOocoo6Y3Ely5dgq2tLbZu3Yrz589j3LhxmD59Ovbs2aPiyMWrpG2qpaUFLy8vhIeH4/Lly5DJZNi+fTsWLlyo4sjFq7Q3vKenp2Ps2LFcqSUfpW3TvXv3Ijo6Wvjp1q2biiIuHyq7D4lKrlevXrC1tcXq1auFsvbt28PNza3YNxKPGTMGWVlZ7Cn9f+XRpt988w0uX76M33//vaLCrFJK26Z+fn548+YNunbtipkzZyI2NlYV4VYJJW3TR48eoW3btoiMjES7du1UGWq54uMnRCo9PR3Xrl1Dz549lcp79uyJixcvFns/SUlJkEgk5Rxd1VQebXr//n0cP36cPfv/r7RteuzYMRw7dgxLly6t6BCrnLJ8TkeOHAlzc3P06dMHBw4cqMgwKwRX+xap8riR+OjRozh58iSOHTtWESFWOWVpUxcXF1y/fh1paWkYPXo05s6dW5GhVhmladMXL15g2rRp2L59O3R1dVURZpVSmjatV68eFixYgC5dukBDQwOHDx+Gt7c3goOD4eHhoYqwywUTksiV9kbiCxcuYMKECVi6dCk6dOhQUeFVSaVp082bNyM5ORk3b97E3LlzsWrVKsyYMaMiw6xSStKmEydOxNixY9GpUydVhFZllaRN9fT0MGXKFOF1u3bt8OrVKwQGBjIhUdmV5Ubi8+fPw93dHX5+fhg3blxFhlmllKVNjYyMAABWVlbIysrC1KlTMXXqVGho1OxfodK06alTp3D27FlhuE6hUCA7Oxt6enpYuXIlxowZU9Fhi1p5LSLQoUMH7Ny5s7zDq1C8hiRSpb2R+OzZsxg2bBhmzpyJSZMmVXSYVUp53ZydnZ2NzMxMZGVllXeIVU5p2vTcuXM4ffq08PPNN99AW1sbp0+fVlp4uaYqr8/pjRs3IJVKyzu8ClWz/7wTuaJuJPb398f//d//4eDBgwDe3Yfk4eGBcePGwd3dHXK5HACgrq6Oxo0bV9p5iElJ2/Tnn39GnTp1YGNjAy0tLVy9ehUBAQFwc3ND7dq1K/NURKOkbWpjY6P0/qtXr6JWrVp5ymuykrbprl27oKmpiTZt2qBWrVo4evQoNm3ahPnz51fiWZQcE5KIDR48GK9evcLy5cshl8thbW2tdCPxixcv8ODBA6H+rl278N9//2HNmjVYs2aNUG5sbIwbN26oPH4xKmmbamho4Pvvv8f9+/ehUChgbGyM8ePHs/f5npK2KRWtNG26YsUKPHnyBOrq6mjZsiXWrl1bpa4fAbwPiYiIRILXkIiISBSYkIiISBSYkIiISBSYkIiISBSYkIiISBSYkIiISBSYkIgqgUwm4yrsRLkwIRGJxIYNG6rc2mNE5Yk3xhJVgszMTGRmZqJOnTpCWadOnWBgYIDffvutEiMjqjzsIVGVkJKSUtkhlCsNDQ2lZFST/Pfff5UdAokUExKpTM51kzt37mDChAkwMTGBqakppkyZgsTERKGenZ0dhgwZglOnTqF3796QSqVYtWoVAOD169eYMWMGLC0tYWBggM6dO2Pt2rVQKJQ7+hKJBF9++SXCw8Ph4OAAqVQKR0fHfB9WmJiYiG+//RZ2dnYwMDBA69atMX/+fKSlpeW7z99//x1OTk6QSqVo3749wsLClOplZmZi+fLl6NChA5o0aQIzMzO4uLgoPcEz9zUkOzs7xMTE4OzZs5BIJJBIJLCzs0NiYiKaNm2KWbNm5Yk7ISEBBgYG+Pbbb4v9f3D//n2MGTMGlpaWkEqlsLW1xejRo/Hs2TOlenv37kXv3r1haGgIExMT9O3bN0/Pbdu2bXB0dIRUKoW5uTk+++wzPH/+XKmOj48PpFIpHj9+jOHDh8PExATDhg1TOk6vXr3QtGlTmJiYwMPDA3fu3Cn2+VD1wsVVSeXGjh0LQ0NDfPfdd7hx4wa2bduGp0+fYt++fUKd+/fvY9SoURg1ahQ+/fRTGBkZIS0tDf3798ft27cxduxYtGrVChEREfj2228RGxsLmUymdJyLFy9i3759+Oyzz1CvXj1s3boVI0aMwIEDB4RHkKekpKBfv3549OgRxowZgxYtWuDGjRtYu3Yt7t69i127dint8/Lly/jtt9/g7e2NkSNHYtu2bZg4cSLs7OxgaWkJAFiyZAlWrlyJkSNHokOHDnj79i3++usv/Pnnn3Bzc8u3TWQyGb7++mvUr18fX331FQBAR0cH9evXR79+/RAeHo5FixYpPX9p3759SE9PL/YCmhkZGRg8eDBSU1Mxfvx4SKVSyOVynDhxAs+ePYOhoSGAd4t0Lly4EO3bt8fMmTOhra2Na9eu4cSJE3B1dQUA/PDDD/D394ejoyMCAgLw9OlTbNy4EefPn8epU6eUkm12djYGDx6M9u3bw9/fH+rq6gCAVatWYf78+ejfvz88PT3x9u1bbNq0CX369MHJkyfRvHnzYp0XVR9MSKRyhoaG2LNnj/D0S6lUiuXLl+PEiRPo2bMnAODBgwfYtWsXPvnkE+F9GzZswM2bN7F69WqMGjUKADB+/HiMHDkSISEhGD9+PFq2bCnU//vvv3Hs2DHhGTIjRowQvhQjIiIAAOvWrUNMTAyioqKEhAIA1tbW+Prrr3Hu3Dk4OjoK5Xfu3MHZs2eFugMHDkTr1q2xY8cOLFiwAABw7NgxuLi4YPXq1cVuk379+sHf3x/6+vp5EoyXlxf27NmDEydOwMXFRSjfvXs3bGxsYGdnV6xj3LlzBw8fPsTWrVuVEqOvr6/w7wcPHmDx4sX46KOP8NNPPyklwJxeaHx8PJYsWYIPP/wQ+/fvF+p06dIFI0aMwNq1a5V6bRkZGXBxccHixYuFsidPnmDhwoWYNWsW/Pz8hHJPT0907twZK1aswNq1a4t1XlR9cMiOVG7ChAlKj2L+/PPPAUBIEgDQrFkzpWQEvPui19PTw4gRI4QyNTU1TJ06FQqFQun9wLvHOL//QLNGjRph2LBhuHTpEhISEgC862U4ODigcePGiI+PF3569OgB4N3TTd/n5OSklLgMDAxgYWGBhw8fCmW6urq4ffs27t27V4JWKViPHj1gaGiIX375RSh79OgRLly4AE9Pz2LvR1dXFwBw/PhxvH37Nt86v/76K7KzszF79uw8T8PN+T+LiopCWloaJk2apFTH1dUVFhYW+Q6Ljh8/Xun1oUOHkJmZiSFDhii1u6amJjp27Jin3almYA+JVO79Xgzw7pHNEokET548EcpMTU3zvO/x48do2bKlMOSTIydBPH78uNDjvF/25MkTSCQS/PPPP7h582a+dYF3j41+n7GxcZ46EokEr1+/Fl77+fnh008/RceOHWFlZYWePXti6NChaN++fb7HKEqtWrXg7u6O9evXIykpCbq6uti9ezfU1NQwdOjQYu+nefPm+PzzzxESEoLdu3fDwcEBffr0gYeHB/T09ABAeMZOYQ/Ly2nnVq1a5dnWqlUrnDlzJk/8Oc/xyfHPP/8AADp37pzvMerWrVvMs6LqhAmJVO793lGO3JMStLW1VXKc7OxsdOvWDTNmzMh3HznXVXLkTob57dfJyQnXr1/HkSNHEBkZiZ9//hnBwcH47rvvCjxOUby8vLBq1SocOnQIw4cPx549e9CtW7c88RVlyZIlGD16NI4cOYITJ07gu+++w4oVK/Dbb7/B2toaCoUi33YrrtztCwCampp5elvZ2dkAgLCwsDzbgHdJjGoeJiRSuXv37in1SOLj4/HmzZt8ex/vMzExwfXr15GVlaWUGO7evStsz32c3O7fvw/gfz2dFi1aIDk5WRiiKy8SiQReXl7w8vJCSkoKhg4diqVLl2LatGkFJrXCEoGlpSXat2+PX375BVZWVrh79y6+/PLLUsVmbW0Na2trzJgxAzdv3kSPHj0QHByM1atXw8zMDAqFArdv3y6wR5fTznfv3oW5ubnStpiYmDz/D/lp0aIFAMDIyAhWVlalOg+qfvhnCKncxo0blf6SDgkJAQB89NFHhb6vT58+ePnyJX766SehTKFQYM2aNVBTU1O64A8AV69exaVLl4TXr169wp49e9CpUydhFtjgwYNx5coVHD58OM/xUlJSkJycXOLze/XqldJrbW1tWFpaIi0trdB7cOrWrStc28qPl5cXTp8+jcDAQOjo6KB///4liisxMRGZmZlKZZaWltDW1haO269fP9SqVQtLly5FVlaWUt2c/7MePXqgdu3aCAkJUapz5MgRxMTEoE+fPkXGMmDAAGhoaEAmkwm9pfflHiqlmoE9JFK5Z8+eYdiwYejTpw9u3ryJrVu3onv37ujVq1eh7xs1ahS2bduG6dOn48aNGzA3N8fvv/+OiIgIfP7553muA9nY2MDDwwMTJ04Upn0nJSVh7ty5Qp0pU6YgIiICI0eOhLu7Ozp06IC0tDTcu3cP+/btExJYSXTu3BmOjo5o3749GjVqhJs3b2Lbtm3o06ePMLEgP+3atcOPP/6IJUuWwNzcHDo6Ovj444+F7UOHDsWcOXNw4MABuLu7o169eiWK69SpU/D19cWAAQNgYWEBhUKB8PBwJCUlYciQIQDe9VxmzpyJJUuWoE+fPhgwYAC0tbVx/fp11KlTBytWrICenh5mz54Nf39/uLm5oX///oiNjcWGDRtgYmKCL774oshYmjdvDn9/f8yZMwe9e/dG//790bBhQzx58gQRERHo2LEjfvjhhxKdH1V9TEikcqGhoVi5cqUwTXrEiBFKU4ILUqdOHRw8eBALFizAvn378Pr1a5iammLBggX5fgk6ODjAyckJS5YswcOHD9GyZUvs2LEDTk5OQh1tbW0cPHgQgYGBCA8Px969e6Gjo4PmzZvDx8cHFhYWJT4/Hx8fHDlyBKdOnUJqaiqaNWuG6dOnY/r06YW+b/bs2Xj+/DnWrVuHxMREGBsbKyWkhg0bok+fPjh06FCJZtflaN26NXr37o3ff/8d27ZtQ+3atWFtbY2dO3cK9xflxGFqaor169dj8eLFQr2pU6cKdb788kvo6ekhJCQE3333HerVqwc3NzfMmzev2IvGTp48Gebm5lizZg2+//57ZGZmomnTpujSpQtGjhxZ4vOjqo9r2ZHKyGQyLF26FNHR0ZBKpRV6LIlEAm9v72r3V/a4ceNw9uxZ3Lp1q8BrUURVFa8hEVUR8fHx+O233+Du7s5kRNUSh+yIRO7hw4e4ePEidu3aBYVCkecmU+DdJIDckxDep66ujsaNG1dkmERlxoREJHJnz57F5MmTYWRkhKCgoHynVTs7OyvdWJybsbExbty4UZFhEpUZryERVQMXLlxAampqgdvr1KmDLl26qDAiopJjQiIiIlHgpAYiIhIFJiQiIhIFJiQiIhIFJiQiIhIFJiQiIhKF/wfOVgsZWJsm2AAAAABJRU5ErkJggg==\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "sns.distplot(data_ps.query(\"intervention==0\")[\"propensity_score\"], kde=False, label=\"Non Treated\")\n",
    "sns.distplot(data_ps.query(\"intervention==1\")[\"propensity_score\"], kde=False, label=\"Treated\")\n",
    "plt.title(\"Positivity Check\")\n",
    "plt.legend();"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "2d650485",
   "metadata": {},
   "source": [
    "最后，我们可以使用倾向得分加权估计器来估计平均干预效果（ATE）。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 33,
   "id": "917eeb84",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Y1: 0.2595774244866067\n",
      "Y0: -0.12892090981713242\n",
      "ATE 0.38849833430373715\n"
     ]
    }
   ],
   "source": [
    "weight = ((data_ps[\"intervention\"]-data_ps[\"propensity_score\"]) /\n",
    "          (data_ps[\"propensity_score\"]*(1-data_ps[\"propensity_score\"])))\n",
    "\n",
    "y1 = sum(data_ps.query(\"intervention==1\")[\"achievement_score\"]*weight_t) / len(data)\n",
    "y0 = sum(data_ps.query(\"intervention==0\")[\"achievement_score\"]*weight_nt) / len(data)\n",
    "\n",
    "ate = np.mean(weight * data_ps[\"achievement_score\"])\n",
    "\n",
    "print(\"Y1:\", y1)\n",
    "print(\"Y0:\", y0)\n",
    "print(\"ATE\", np.mean(weight * data_ps[\"achievement_score\"]))"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "43b0d1a3",
   "metadata": {},
   "source": [
    "倾向得分加权表示，就成就而言，我们应该期望接受干预的个体比未经干预的同伴高 0.38 个标准差。 我们还可以看到，如果没有人得到干预，我们应该期望成绩的总体水平比现在低 0.12 个标准差。 同样的道理，如果我们为每个人提供研讨会，我们应该期望一般成就水平高出 0.25 个标准差。 将此与我们通过简单比较干预和未干预得到的 0.47 ATE 估计值进行对比。 这证明我们的偏差确实是正向的，并且控制 X 让我们对成长心态的影响有了更适度的估计。\n",
    "\n",
    "## 标准误差\n",
    "\n",
    "![img](./data/img/ps/bootstrap.png)\n",
    "\n",
    "为了计算 IPTW 估计量的标准误差，我们可以使用加权平均方差的公式。\n",
    "\n",
    "$\n",
    "\\sigma^2_w = \\dfrac{\\sum_{i=1}^{n}w_i(y_i-\\hat{\\mu})^2}{\\sum_{i=1}^{n}w_i}\n",
    "$\n",
    "\n",
    "但是，只有当我们有真实的倾向得分时，我们才能使用它。 如果我们使用它的估计版本，\\\\(\\hat{P}(x)\\\\)，我们需要考虑这个估计过程中的错误。 最简单的方法是引导整个过程。 这是通过从原始数据中进行自助法采样（bootstrapping）并像我们上面所做的那样计算 ATE 来实现的。 然后我们重复多次以获得 ATE 估计的分布。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 34,
   "id": "6e7b5e8b",
   "metadata": {},
   "outputs": [],
   "source": [
    "from joblib import Parallel, delayed # for parallel processing\n",
    "\n",
    "# define function that computes the IPTW estimator\n",
    "def run_ps(df, X, T, y):\n",
    "    # estimate the propensity score\n",
    "    ps = LogisticRegression(C=1e6).fit(df[X], df[T]).predict_proba(df[X])[:, 1]\n",
    "    \n",
    "    weight = (df[T]-ps) / (ps*(1-ps)) # define the weights\n",
    "    return np.mean(weight * df[y]) # compute the ATE\n",
    "\n",
    "np.random.seed(88)\n",
    "# run 1000 bootstrap samples\n",
    "bootstrap_sample = 1000\n",
    "ates = Parallel(n_jobs=4)(delayed(run_ps)(data_with_categ.sample(frac=1, replace=True), X, T, Y)\n",
    "                          for _ in range(bootstrap_sample))\n",
    "ates = np.array(ates)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "64b5dae2",
   "metadata": {},
   "source": [
    "ATE 是自助法采样样本的平均值。 为了获得置信区间，我们可以自助法采样分布的分位数。 对于 95% C.I.，我们使用 2.5 和 97.5 百分位数。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 35,
   "id": "f8c70dfb",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "ATE: 0.3877452824895804\n",
      "95% C.I.: (0.35448188811098386, 0.41992764030841984)\n"
     ]
    }
   ],
   "source": [
    "print(f\"ATE: {ates.mean()}\")\n",
    "print(f\"95% C.I.: {(np.percentile(ates, 2.5), np.percentile(ates, 97.5))}\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "8a9ef08a",
   "metadata": {},
   "source": [
    "我们还可以直观地了解引导样本的外观以及置信区间。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 36,
   "id": "748be1b1",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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7ygyMhIBAQHw8/ND8+bNERkZidzcXOzevVuIEIiIqIoTpCB5eXkhISEBf/75JwAgNTUVv/zyC3r16gUAuHHjBhQKBXr06KF9joWFBby9vZGSkiJECEREVMUJMu07ICAAubm58PT0hImJCYqKivDJJ59gwoQJAACFQgEAkMlkOs+TyWS4e/euECEQEVEVJ0hBiomJwY4dOxAdHQ13d3dcuHABQUFBcHZ2xnvvvadtJ5FIdJ6nVqtLLHtSWlqaEOEZXXXJQ1/VPV9FhkkpyxRGiMR4nsw3rVaxESOpPNX9c/00Q+Tr6ur6zPWCFKQFCxbggw8+wJAhQwAAHh4euHXrFr788ku89957kMvlAICMjAw4Ojpqn3f//v0SvaYnPS/4qiAtLa1a5KGvmpDv0/etU2QoILeTGymayvd0vq6u1f/C2JrwuX6SsfIV5BzSw4cPYWKi+63RxMQEKpUKANCwYUPI5XLExcVp1z969AhJSUnw9PQUIgQiIqriBOkh9e3bFytXrkTDhg3h7u6O33//HRERERg5ciSAx0N1U6ZMQXh4OFxdXdGkSRMsX74clpaWGDp0qBAhEJWbvrfKIaLKIUhB+uKLL/D5559j5syZuH//PuRyOcaMGYNZs2Zp28yYMQN5eXkIDAyEUqlE+/btERMTAysrKyFCICKiKk6QgmRlZYVly5Zh2bJlZbaRSCQIDg5GcHCwEC9JRETVDO9lR0REosCCREREosCCREREosAf6COiF1LR2Yr8YT96GntIREQkCixIREQkCixIREQkCixIREQkCixIREQkCixIREQkCixIREQkCixIREQkCixIREQkCixIREQkCixIREQkCixIREQkCixIREQkCixIREQkCixIREQkCixIREQkCixIREQkCixIREQkCixIREQkCixIREQkCixIREQkCixIREQkCoIVpHv37sHf3x8uLi6Qy+Xw9PREQkKCdr1arUZISAjc3d1hb28PX19fXL58WaiXJyKiKk6QgqRUKtGnTx+o1Wrs3LkTKSkp+OKLLyCTybRtVq1ahYiICISGhuLYsWOQyWQYPHgwcnJyhAiBiIiqOFMhNvLVV1/B3t4eUVFR2mWNGjXS/r9arUZkZCQCAgLg5+cHAIiMjISrqyt2796NcePGCREGERFVYYL0kPbv34/27dtj3LhxaNKkCTp37oy1a9dCrVYDAG7cuAGFQoEePXpon2NhYQFvb2+kpKQIEQIREVVxgvSQrl+/jvXr12Pq1KkICAjAhQsXMHv2bADApEmToFAoAEBnCE/z+O7du2VuNy0tTYjwjK665KGvqpKvIsNEwG0pBNtWVSBEvmm1igWIpPJUlc+1UAyRr6ur6zPXC1KQVCoV2rZti4ULFwIAWrdujfT0dERHR2PSpEnadhKJROd5arW6xLInPS/4qiAtLa1a5KGvqpSvXPVAkO0oMhSQ28kF2VZVIFS+rq6WAkRTOarS51oIxspXkIIkl8vh5uams6xp06a4ffu2dj0AZGRkwNHRUdvm/v37JXpNROW16YowhYWIjEuQc0heXl64evWqzrKrV6/CyckJANCwYUPI5XLExcVp1z969AhJSUnw9PQUIgQiIqriBClIU6dOxenTp7F8+XKkp6djz549WLt2LSZMmADg8VDdlClTsHLlSsTGxuLSpUuYOnUqLC0tMXToUCFCICKiKk6QIbt27dph27ZtWLRoEcLCwuDo6Ig5c+ZoCxIAzJgxA3l5eQgMDIRSqUT79u0RExMDKysrIUKgaoLDb0Q1lyAFCQD69OmDPn36lLleIpEgODgYwcHBQr0kERFVI7yXHRERiQILEhERiQILEhERiQILEhERiQILEhERiQILEhERiQILEhERiQILEhERiQILEhERiQILEhERiQILEhERiQILEhERiQILEhERiQILEhERiQILEhERiQILEhERiQILEhERiQILEhERiQILEhERiYKpsQMgoppp05UH5X7OWDdLA0RCYsEeEhERiQILEhERiQILEhERiQILEhERiQILEhERiYJBClJ4eDikUikCAwO1y9RqNUJCQuDu7g57e3v4+vri8uXLhnh5IiKqggQvSKdPn8bmzZvh4eGhs3zVqlWIiIhAaGgojh07BplMhsGDByMnJ0foEIiIqAoStCBlZWVh4sSJWL16NaRSqXa5Wq1GZGQkAgIC4Ofnh+bNmyMyMhK5ubnYvXu3kCEQEVEVJWhB0hScbt266Sy/ceMGFAoFevTooV1mYWEBb29vpKSkCBkCERFVUYLdqWHz5s1IT09HVFRUiXUKhQIAIJPJdJbLZDLcvXu3zG2mpaUJFZ5RVZc89PUi+SoyTASMpPIoMhTGDqFSGSvftFrFRnldgPuxEFxdXZ+5XpCClJaW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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "sns.distplot(ates, kde=False)\n",
    "plt.vlines(np.percentile(ates, 2.5), 0, 30, linestyles=\"dotted\")\n",
    "plt.vlines(np.percentile(ates, 97.5), 0, 30, linestyles=\"dotted\", label=\"95% CI\")\n",
    "plt.title(\"ATE Bootstrap Distribution\")\n",
    "plt.legend();"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "948aff5f",
   "metadata": {},
   "source": [
    "## 倾向得分的常见问题\n",
    "\n",
    "作为一名数据科学家，我知道使用机器学习工具包的所有功能来使倾向得分估计尽可能精确是很诱人的。你很快就会被 AUC 优化、交叉验证和贝叶斯超参数调优这些很炫的技术所吸引。我现在并不是说你不应该那样做。事实上，所有关于倾向得分和机器学习的理论都是最近才出现的，所以还有很多我们还不知道的。但首先对一些基础的东西加以理解是值得的。\n",
    "\n",
    "首先，倾向得分的预测质量并不能转化为它的平衡特性。对于来自机器学习领域的人来说，要学好因果推理，最具挑战性的方面之一就是放弃将所有事情都视为预测问题。事实上，最大化倾向得分的预测能力甚至会损害因果推理的目标。 **倾向评分不需要很好地预测干预。它只需要包含所有混淆变量**。如果我们包括在预测干预方面非常好的变量，但对结果没有影响，这实际上会增加倾向评分估计量的方差。当我们包含与干预相关但与结果无关的变量时，这类似于线性回归面临的问题。\n",
    "\n",
    "![img](./data/img/ps/ml-trap.png)\n",
    "\n",
    "要了解这一点，请考虑以下示例（改编自 Hernán's 的书 [Causal Inference: What If](https://www.hsph.harvard.edu/miguel-hernan/causal-inference-book/)）。 假设有 2 所学校，其中一所将成长心态研讨会应用于 99% 的学生，另一所则应用于 1%。 假设学校对干预效果没有影响（即只通过干预分配进行影响），则无需对其进行控制。 如果将学校变量添加到倾向得分模型中，它将具有非常高的预测能力。 然而，有一种可能，我们最终得到一个样本，其中学校 A 的每个人都接受了干预，导致该学校的倾向得分为 1，这将导致无限方差。 这是一个极端的例子，但让我们通过模拟数据来看看具体是怎么实现的。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 37,
   "id": "0cefad52",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>T</th>\n",
       "      <th>school</th>\n",
       "      <th>intercept</th>\n",
       "      <th>y</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0.309526</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>1.571468</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>2.982024</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>2.445420</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>2.693187</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   T  school  intercept         y\n",
       "0  1       0          1  0.309526\n",
       "1  1       0          1  1.571468\n",
       "2  1       0          1  2.982024\n",
       "3  1       0          1  2.445420\n",
       "4  1       0          1  2.693187"
      ]
     },
     "execution_count": 37,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.random.seed(42)\n",
    "school_a = pd.DataFrame(dict(T=np.random.binomial(1, .99, 400), school=0, intercept=1))\n",
    "school_b = pd.DataFrame(dict(T=np.random.binomial(1, .01, 400), school=1, intercept=1))\n",
    "ex_data = pd.concat([school_a, school_b]).assign(y = lambda d: np.random.normal(1 + 0.1 * d[\"T\"]))\n",
    "ex_data.head()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "d105d311",
   "metadata": {},
   "source": [
    "在模拟了这些数据后，我们运行两次自助法采样（bootstrapping），并对采样样本使用倾向得分算法。 第一次，倾向评分模型中包括了学校作为一个特征。 第二次，模型中不包括学校。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 38,
   "id": "4e834fd8",
   "metadata": {},
   "outputs": [],
   "source": [
    "ate_w_f = np.array([run_ps(ex_data.sample(frac=1, replace=True), [\"school\"], \"T\", \"y\") for _ in range(500)])\n",
    "ate_wo_f = np.array([run_ps(ex_data.sample(frac=1, replace=True), [\"intercept\"], \"T\", \"y\") for _ in range(500)])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 39,
   "id": "beb4cbea",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "sns.distplot(ate_w_f, kde=False, label=\"PS W School\")\n",
    "sns.distplot(ate_wo_f, kde=False, label=\"PS W/O School\")\n",
    "plt.legend();"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "7ad338f2",
   "metadata": {},
   "source": [
    "如你所见，添加学校这个特征的倾向得分估计器具有巨大的方差，而没有这个特征的倾向得分估计器表现得更好。 此外，由于学校不是混淆因子，因此没有它的模型也没有偏差。 正如我所说，简单地预测是否进行了干预并不是重点。 我们在进行预测的时候，实际上需要以控制混淆因子为目的来构建模型，而不是以对干预变量本身进行预测为目的。\n",
    "\n",
    "这导致了倾向评分方法中经常遇到的另一个问题。 比如在我们的心态案例中，数据显然是非常平衡的。 但实际情况并非总是如此。 在某些情况下，接受干预的人比未经干预的人有更高的被干预概率，从而导致倾向得分分布没有太多重叠。（从而违背了positivity这个假设：译者著）"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 40,
   "id": "a3fea4a5",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "sns.distplot(np.random.beta(4,1,500), kde=False, label=\"Non Treated\")\n",
    "sns.distplot(np.random.beta(1,3,500), kde=False, label=\"Treated\")\n",
    "plt.title(\"Positivity Check\")\n",
    "plt.legend();"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "bd4513dd",
   "metadata": {},
   "source": [
    "如果发生这种情况，则意味着正值性（positivity）不是很强。如果接受干预的人的倾向得分为 0.9，而未经干预的人的最大倾向得分为 0.7，那么我们将没有任何未经干预的人与倾向得分为 0.9 的个体进行比较。这种缺乏平衡会产生一些偏差，因为我们必须将干预结果外推到未知区域。不仅如此，倾向得分非常高或非常低的实体具有非常高的权重，这会增加方差。作为一般经验法则，如果任何权重高于 20（倾向得分为 0.95 的未干预样本或倾向得分为 0.05 的被干预样本都会发生这种情况），您就会遇到麻烦。\n",
    "\n",
    "另一种方法是将权重限制为最大 20。这将减少方差，但实际上会产生更多偏差。老实说，虽然这是减少差异的常见做法，但我并不喜欢它。你永远不会知道你用剪裁（clipping）引起的偏差是否太大。此外，如果分布不重叠，那么您的数据可能还不足以得出因果结论。为了进一步了解这一点，我们可以研究一种结合倾向得分和匹配的技术\n",
    "\n",
    "## 倾向得分匹配\n",
    "\n",
    "正如我之前所说，当你有倾向得分时，你不需要控制 X。 控制它就足够了。 因此，您可以将倾向得分视为对特征空间执行一种降维。 它将 X 中的所有特征浓缩到一个单一的处理分配维度中。 因此，我们可以将倾向得分视为其他模型的输入特征。 以回归模型为例。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 41,
   "id": "d90a4f95",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<table class=\"simpletable\">\n",
       "<tr>\n",
       "          <td></td>            <th>coef</th>     <th>std err</th>      <th>t</th>      <th>P>|t|</th>  <th>[0.025</th>    <th>0.975]</th>  \n",
       "</tr>\n",
       "<tr>\n",
       "  <th>Intercept</th>        <td>   -3.0770</td> <td>    0.065</td> <td>  -47.064</td> <td> 0.000</td> <td>   -3.205</td> <td>   -2.949</td>\n",
       "</tr>\n",
       "<tr>\n",
       "  <th>intervention</th>     <td>    0.3930</td> <td>    0.019</td> <td>   20.974</td> <td> 0.000</td> <td>    0.356</td> <td>    0.430</td>\n",
       "</tr>\n",
       "<tr>\n",
       "  <th>propensity_score</th> <td>    9.0553</td> <td>    0.200</td> <td>   45.317</td> <td> 0.000</td> <td>    8.664</td> <td>    9.447</td>\n",
       "</tr>\n",
       "</table>"
      ],
      "text/plain": [
       "<class 'statsmodels.iolib.table.SimpleTable'>"
      ]
     },
     "execution_count": 41,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "smf.ols(\"achievement_score ~ intervention + propensity_score\", data=data_ps).fit().summary().tables[1]"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "e4d59077",
   "metadata": {},
   "source": [
    "如果我们控制倾向得分，我们现在估计 ATE 为 0.39，低于我们之前使用回归模型而不控制倾向得分得到的 0.47。 我们还可以在倾向得分上使用匹配。 这一次，我们可以找到仅具有相同倾向得分的匹配，而不是试图找到所有 X 特征中相似的匹配。\n",
    "\n",
    "这是对匹配估计器的巨大改进，因为它处理了维度灾难。 此外，如果一个特征对干预的分配不重要，倾向评分模型将学习这一点，并在拟合干预机制时对其给予较低的重要性。 另一方面，特征匹配仍然会尝试找到个人在这个不重要特征上相似的匹配。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 42,
   "id": "0914a75c",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "Treatment Effect Estimates: Matching\n",
      "\n",
      "                     Est.       S.e.          z      P>|z|      [95% Conf. int.]\n",
      "--------------------------------------------------------------------------------\n",
      "           ATE      0.390      0.025     15.600      0.000      0.341      0.439\n",
      "           ATC      0.380      0.027     13.876      0.000      0.326      0.434\n",
      "           ATT      0.410      0.027     15.349      0.000      0.357      0.462\n",
      "\n"
     ]
    }
   ],
   "source": [
    "cm = CausalModel(\n",
    "    Y=data_ps[\"achievement_score\"].values, \n",
    "    D=data_ps[\"intervention\"].values, \n",
    "    X=data_ps[[\"propensity_score\"]].values\n",
    ")\n",
    "\n",
    "cm.est_via_matching(matches=1, bias_adj=True)\n",
    "\n",
    "print(cm.estimates)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "79fc8171",
   "metadata": {},
   "source": [
    "正如我们所看到的，我们也得到了 0.38 的 ATE，这更符合我们之前通过倾向得分加权看到的结果。 倾向得分的匹配也让我们对为什么在干预和未干预之间的倾向得分有小的重叠是危险的有一些直觉。 如果发生这种情况，倾向得分差异的匹配将很大，这将导致偏差，正如我们在匹配章节中看到的那样。\n",
    "\n",
    "最后要注意的是，上述标准误差是错误的，因为它们没有考虑倾向得分估计的不确定性。 不幸的是，[自助法（bootstrap）不适用于匹配](https://economics.mit.edu/files/11862)。 此外，上述理论太新了，以至于没有具有正确标准误差的倾向评分方法的 Python 实现。 出于这个原因，我们在 Python 中看不到很多倾向得分匹配。\n",
    "\n",
    "## 关键思想\n",
    "\n",
    "在这里，我们了解到接受干预的概率称为倾向得分，我们可以将其用作平衡得分。这意味着，如果我们有倾向得分，我们就不需要直接控制混杂因素。为了识别因果效应，控制倾向得分就足够了。我们看到了倾向得分如何作为混杂空间的降维。\n",
    "\n",
    "这些属性使我们能够推导出因果推理的加权估计量。不仅如此，我们还看到了如何将倾向得分与其他方法一起使用来控制混杂偏差。\n",
    "\n",
    "然后，我们研究了倾向得分和一般因果推理可能出现的一些常见问题。第一个是当我们被分配干预机制的任务所迷惑时。我们看到，以一种非常违反直觉（因此很容易出错）的方式，提高接受干预可能的预测性反而**不会**转化为更好的因果估计，因为它会增加方差。\n",
    "\n",
    "最后，我们研究了一些外推问题，如果我们无法在干预和未干预的倾向得分分布之间有良好的重叠，我们可能会遇到这些问题。"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.6"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
